芯片资讯
你的位置:LONGSON龙芯中科(龙芯)处理器IC芯片全系列-亿配芯城 > 芯片资讯 > gdb动态调试演示
gdb动态调试演示
- 发布日期:2024-01-09 12:13 点击次数:98
今天要分享给大家的是gdb动态调试( 动态调试就是在不终止正在运行的进程的情况下,来对这个正在运行的进程进行调试,我一般习惯称之为在线调试 )在平时开发Linux应用程序时,不管是桌面Linux应用开发,还是嵌入式Linux应用开发,在我们接到新需求开始撸代码的时候(一般这时候都是在公司编码测试,可以运行带调试信息的debug版程序),都可以使用该技能进行代码的调测,简单实用。
为了给大家演示方便,我简单写了个测试程序,代码如下:
#include #include 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 比如: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动态调试在不打断程序运行的情况下,进行在线调测还是很有用的,一般在排查问题、动态改变程序执行逻辑、单元/集成测试等都可以使用,用起来非常的香!
相关资讯