一、样例代码1 #includeiostream 2 using namespace std; 3 int func(int start,int end){ 4 int total0; 5 for(int istart;iend;i){ 6 totali; 7 } 8 return total; 9 } 10 int main(){ 11 int start1; 12 int end100; 13 coutI will beginendl; 14 int resfunc(start,end); 15 coutresendl; 16 return 0; 17 }二、预备程序发布方式有两种debug和releaseLinux上gcc/g出来的二进制程序默认是release模式。要使用gdb调试必须在源码生成二进制程序的时候加上-g选项。1 test.exe_debug:*.cpp 2 g -o $ $^ -g 3 .PHONY:clean 4 clean: 5 rm -rf test.exe[xhx_homeiZ2zeiwy4tf4rghoyh5d1yZ cgdb_learning]$ ll total 68 -rw-rw-r-- 1 xhx_home xhx_home 76 Mar 7 16:28 Makefile -rw-rw-r-- 1 xhx_home xhx_home 271 Mar 7 16:25 test.cpp -rwxrwxr-x 1 xhx_home xhx_home 39552 Mar 7 16:28 test.exe_debug -rwxrwxr-x 1 xhx_home xhx_home 18280 Mar 7 16:28 test.exe_release其中很明显可以看出debug模式占据了更大的内存这是因为debug版本相比release版本会有许多配置文件三、常见的使用开始gdb:binFiile退出Ctrld或quit命令作用样例list/l显示源代码从上次位置开始一次显示10行list/l 10list/l列出指定函数的源代码list/l funclist/l列出指定文件的源代码list/l test.c:1r/run从程序开始连续执行runn/next单步执行不进入函数内部逐过程nexts/step单步执行进入函数内部逐语句stepbreak/b [文件名]行号在指定行号设置断点break 10break test.c:10break/b 函数名在函数开头设置断点break maininfo break/b查看当前所有断点的信息info breakprint/p 表达式打印表达式的值p xset ver 变量值修改变量的值set var i10continue/c从当前位置开始连续执行程序continuedelete/d breakpoints删除所有断点delete breakpointsdelete/dbreakpoints n删除序号为n的断点delete breakpoints 1disable breakpoints静用所有的断点disable breakpointsenable breakpoints启用所有断点enable breakpointsinfo/i breakpoints查看当前设置的断点列表info breakpointsdisplay 变量名跟踪显示指定变量的值每次停止时display xundisplay 编号取消对指定编号的变量的跟踪显示undisplay 1until x行号执行到指定行号不在范围内会默认向下执行until 20backtrace/bt查看当前执行栈的各级函数调用及参数backtraceinfo/i locals查看当前栈帧的局部变量值info local四、常见技巧1.watch执行时监视一个表达式的值。如果监视的表达式在程序运行期间的值发生变化GDB会暂停程序的执行并通知使用者。2.set var确定问题的原因假设我们想得到-res1 #includeiostream 2 using namespace std; 3 //int flag-1; 4 int flag0; 5 int func(int start,int end){ 6 int total0; 7 for(int istart;iend;i){ 8 totali; 9 } 10 int re flag*total; 11 return re; 12 } 13 int main(){ 14 int start1; 15 int end100; 16 coutI will beginendl; 17 int resfunc(start,end); 18 coutresendl; 19 return 0; 20 }(gdb) b 10 Breakpoint 1 at 0x4008a1: file test.cpp, line 10. (gdb) r Starting program: /home/xhx_home/cgdb_learning/test.exe_debug Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-164.el8.x86_64 I will begin Breakpoint 1, func (start1, end100) at test.cpp:10 Missing separate debuginfos, use: yum debuginfo-install libgcc-8.5.0-4.el8_5.x86_64 libs tdc-8.5.0-4.el8_5.x86_64 (gdb) display total 1: total 5050 2: re 32767 3: flag 0 (gdb) set var flag-1 (gdb) s 1: total 5050 2: re -5050 3: flag -1 (gdb)3.条件断点1添加条件断点 b [行号] if 条件(gdb) b 8 if i50 Breakpoint 1 at 0x400895: file test.cpp, line 8. (gdb) r Starting program: /home/xhx_home/cgdb_learning/test.exe_debug Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-164.el8.x86_64 I will begin Breakpoint 1, func (start1, end100) at test.cpp:8 Missing separate debuginfos, use: yum debuginfo-install libgcc-8.5.0-4.el8_5.x86_64 libs tdc-8.5.0-4.el8_5.x86_64 (gdb) p i $1 50 (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400895 in func(int, int) at test.cpp:8 stop only if i50 breakpoint already hit 1 time2给已经存在的断点新增条件 condition [断点序号] 条件(gdb) b 8 Breakpoint 1 at 0x400895: file test.cpp, line 8. (gdb) condition 1 i30 (gdb) r Starting program: /home/xhx_home/cgdb_learning/test.exe_debug Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-164.el8.x86_64 I will begin Breakpoint 1, func (start1, end100) at test.cpp:8 Missing separate debuginfos, use: yum debuginfo-install libgcc-8.5.0-4.el8_5.x86_64 libs tdc-8.5.0-4.el8_5.x86_64 (gdb) p i $1 30注意条件断点添加常见的两种方式1.新增 2.给已有断点追加注意两者语法区别新增b 行号/文件名行号/函数名 if i30(条件给已有断点追加condition 2 i30 ,其中2为已有断点编号没有ifcgdb分屏操作Esc进入代码屏i回到gbd屏