0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

gdb动态调试演示

麦辣鸡腿堡 来源:嵌入式软件那些事 作者:静以修身 2023-11-01 15:28 次阅读

今天要分享给大家的是gdb动态调试( 动态调试就是在不终止正在运行的进程的情况下,来对这个正在运行的进程进行调试,我一般习惯称之为在线调试 )在平时开发Linux应用程序时,不管是桌面Linux应用开发,还是嵌入式Linux应用开发,在我们接到新需求开始撸代码的时候(一般这时候都是在公司编码测试,可以运行带调试信息的debug版程序),都可以使用该技能进行代码的调测,简单实用。

为了给大家演示方便,我简单写了个测试程序,代码如下:

#include < stdio.h >
#include < pthread.h >


typedef struct
{
    int a;
    char b;
    char *c;
} TEST;


int data;
TEST test;


int fun(void)
{
    printf("global variable data = %dn", data);
}


int fun2(int val)
{
    data = val;
    printf("set global variable data = %dn", data);
}


void *thread()
{
    while(1)
    {
        //printf("thread is runningn");
        sleep(1);
    }
}


int main(int argc, char *argv[])
{
    pthread_t tid;


    data = 100;

    test.a = 10;
    test.b = 'a';
    test.c = "hello world";


    pthread_create(&tid, NULL, thread, NULL);

    pause();


    return 1;
}

为了不让程序自动结束,我创建了一个线程,然后使用如下命令进行编译,生成带调试信息的可执行程序文件。

gcc -g -o main main.c -lpthread

使用&符号,让程序在后台运行,记下程序的进程号PID(或者使用ps -e | grep main命令查询):

图片

gdb动态调试有多种使用方式,感兴趣的小伙伴可以直接找度娘搜索下,下面是最常用的一种方式:

gdb < 可执行程序名 > < 进程ID >


比如:gdb < 可执行程序名 > 1234


这条命令会把进程ID为1234的进程与gdb联系起来,也就是说,这条命令会把进程ID为1234的进程的地址空间附着在gdb的地址空间中,然后使这个进程在gdb的环境下运行,这样的话,gdb就可以清楚地了解该进程的执行情况、函数堆栈、内存使用情况等等。

从上面我们查到main进程的PID为21310,直接执行gdb main 21310即可开启main进程的动态调试。

图片

这时候我们借助强大的gdb可以做的事情就非常多了:

  • 查看某个全局变量的值(gdb的print命令显示结构体变量是非常的nice)
  • 修改某个全局变量的值(也可以单独修改结构体变量的某个成员)
  • 直接执行某个函数(无参函数、有参函数都可以)
  • 设置断点
  • ......
    以上这些常用的功能基本可以满足我们的调试需求,使用效果如下:

图片

编译x86电脑上用的gdb

cd /home/tools/gdb/gdb-8.2
mkdir build
cd build
../configure --prefix=/home/tools/gdb/gdb_install_x86/
make && make install

编译arm终端上用的gdb(需要交叉编译,交叉编译工具链换成对应的即可)

cd /home/tools/gdb/gdb-8.2
mkdir build
cd build
../configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CPP=arm-linux-gnueabihf-cpp CXX=arm-linux-gnueabihf-g++ --prefix=/home/tools/gdb/gdb_install_arm/
make && make install

另外,如果感觉生成的gdb可执行程序文件比较大(默认是带着调试信息的),可以用strip命令裁剪下即可,不影响使用!

好了,今天就先写到这吧,gdb动态调试在不打断程序运行的情况下,进行在线调测还是很有用的,一般在排查问题、动态改变程序执行逻辑、单元/集成测试等都可以使用,用起来非常的香!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4983

    文章

    18295

    浏览量

    288597
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206745
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79554
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814
收藏 人收藏

    评论

    相关推荐

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB调试入门。
    发表于 06-27 15:48 338次阅读

    ARM平台如何玩转GDB远程调试

    搭建正常,执行如下命令可查看交叉编译工具版本。Host# aarch64-poky-linux-gcc -v图 22 演示程序创建与编译执行如下命令,新建一个GDB调试演示程序。Host# mkdir
    发表于 09-27 15:28

    GDB调试命令手册

    GDB调试命令手册,感兴趣的可以下载看看。
    发表于 11-05 16:36 9次下载

    在Linux中如何使用gdb调试C程序?

    通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。
    发表于 04-28 15:37 1564次阅读

    嵌入式Linux的GDB调试环境建立

    嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序在嵌入式
    发表于 04-02 14:33 397次阅读

    Linux应用的GDB调试的原理及过程分析

    GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试
    发表于 03-05 09:44 3189次阅读
    Linux应用的<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>的原理及过程分析

    实例演示GDB的使用

    GDB简介 GDB(GNU Debugger)是一个强大的命令行调试工具。一般的,在Windows下进行开发,很少操控命令行调试调试器大多
    的头像 发表于 10-19 09:58 2355次阅读
    实例<b class='flag-5'>演示</b><b class='flag-5'>GDB</b>的使用

    嵌入式Linux GDB调试环境搭建与使用

    这里写目录标题简介在Ubuntu下简单体验GDB嵌入式GDB移植GDB 常用命令参考网络通信设置注意事项简介Linux系统常用GDB调试C代
    发表于 11-01 17:59 8次下载
    嵌入式Linux <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>环境搭建与使用

    Linux嵌入式 gdb VSCode图形化调试教程

    文章目录介绍GDB简介交叉编译器的gdb介绍在学习单片机的时候我们可以通过集成式IDE 来进行调试,比如MDK、IAR 等。在嵌入式linux 领域是否也可以进行调试呢?答案肯定是可以
    发表于 11-02 12:21 15次下载
    Linux嵌入式 <b class='flag-5'>gdb</b> VSCode图形化<b class='flag-5'>调试</b>教程

    ARM平台如何玩转GDB远程调试

    前言关于GDB工具GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行程序、单步执行、跳入/跳出函数、
    的头像 发表于 09-28 18:17 652次阅读
    ARM平台如何玩转<b class='flag-5'>GDB</b>远程<b class='flag-5'>调试</b>?

    在ubuntu中调试GDB

    的 gcc 编译器即可,注意需要加 -g 选项,才能使用 gdb 调试 arm-linux-gnueabihf-gcc gdbtest .c -o gdbtest -g //编译测试程序,注意-g 选项
    的头像 发表于 07-27 16:31 646次阅读
    在ubuntu中<b class='flag-5'>调试</b><b class='flag-5'>GDB</b>

    GDB调试里怎么设置断点

    本篇讲解使用GDB调试Linux应用程序,以下以 hellowld.c 为例介绍 GDB调试入门: 设置断点   disable                 # 禁用所有断点
    的头像 发表于 10-04 16:10 571次阅读

    GDB调试工具的原理

    一、GDB调试工具的原理 1.1 未执行进程调试 启用gdb调试运行gdb ./test的时候,
    的头像 发表于 11-09 17:04 335次阅读
    <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具的原理

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序进程,首先先用top命令查看运行的程序进程的pid如下: 比如我要加载的程序
    的头像 发表于 11-09 17:17 343次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具

    如何使用linux下gdb调试python程序

    如何使用linux下gdb调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。
    的头像 发表于 01-31 10:41 475次阅读