时间:2021-07-01 10:21:17 帮助过:36人阅读
Gdb调试
在Linux下进行C++程序的调试,其中gdb是非常强大的工具,不再使用LOG_INFO这种使用输出来观察数据的正确性,及如何面对段错误,这种非常难以定位的问题,在gdb中都能够给予非常好的支持,其具体使用方法如下:
整个程序如下:
#include <stdio.h> int nGlobalVar = 0; int tempFunction(int a, int b) { printf("tempFunction is called, a = %d, b = %d \n", a, b); return (a + b); } int main() { int n; n = 1; n++; n--; nGlobalVar += 100; nGlobalVar -= 12; printf("n = %d, nGlobalVar = %d \n", n, nGlobalVar); n = tempFunction(1, 2); int i=0; for(;i<10;++i) { printf("data is %d\n",i); } printf("n = %d\n", n); return 0; }
断点位置的设置,可以包括行号、函数:
指定的行号 :b 12
指定的文件行号:b test:12
指定的函数:b fun
指定文件的函数:b test:fun
根据条件设置断点:b 21 if i==5
Breakpoint 1 at 0x4008b6: file /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc, line 21. (gdb) r Starting program: /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/bin/gdb_test n = 1, nGlobalVar = 88 tempFunction is called, a = 1, b = 2 data is 0 data is 1 data is 2 data is 3 data is 4 |
在i为5的时候程序停止
得到的结果为:
Breakpoint 2, main () at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:18 18 int i=0; (gdb) watch i Hardware watchpoint 4: i (gdb) c Continuing. data is 0 Hardware watchpoint 4: i
Old value = 0 New value = 1 0x00000000004008ce in main () at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:19 19 for(;i<10;++i) |
可以看到变量发生变化前后的值。
与Break之间的区别在于它是一个temp的断点,运行一次之后该断点将会被删除。
如果要调试一个core文件,当程序奔溃之后生成一个core文件,然后直接定位到发生程序奔溃的位置,可以采用:ulimit -c unlimited生成core文件。
问题:对core文件如何的调试?
在gdb 命令中使用:gdb core文件
whatis i
type = int
添加一个结构体,在main中添加一个类变量 TestA _test A;
class testA { public: int a; int b; TestA() { a = 2; b = 5; } }; |
设置断点:b 29,r运行,p _testA,得到:
$6 = {a = -7296, b = 32767}
执行whatis _testA,得到:
type=TestA
想要更详细的信息:ptype _testA,结果为:
type = class TestA { public: int a; int b; TestA(void); } |
可以观察到,在每个print后面都会给输出的变量加一个变量标号,所以,可以使用该标记输出,而不同输出冗长的变量名,比如:
(gdb) p nGlobalVar $1 = 88 (gdb) p $1 $2 = 88 |
print tempFunction(2,3)将得到5
printf("n = %d\n", n);
Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400854 in main() at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:14 breakpoint already hit 1 time 2 breakpoint keep y 0x00000000004008b6 in main() at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:26 stop only if i==4 3 breakpoint keep y <PENDING> i==5 4 breakpoint keep y 0x00000000004008b6 in main() at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:26 stop only if i==5 |
再次执行info b之后,该断点已经被删除,但是后面的断点的序号并不会发生改变,整个断点的序号变为:1,2,4
(gdb) delete 1-2 (gdb) info b Num Type Disp Enb Address What 4 breakpoint keep y 0x00000000004008b6 in main() at /root/project/monitor_center/dbhelper_server/Debug/Test/Gdb_Test/swap_1.cc:26 stop only if i==5 |
可以看到只有4号断点了
1. 列出当前的目录:pwd
2. 改变运行的目录:cd
3. Info program 查看程序是否在运行
gdb 调试
标签:文件的 数值 har help 地址 错误 linux 指定 类变量