ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 使用gdb调试程序 ## 编译程序 如果要用gdb调试,编译时要加上-g选项,生成调试用的符号表; ``` gcc 1.cpp -g ``` 生成可执行文件a.exe ## 运行gdb gdb a.exe 这样,gdb在运行时会自动装入刚才生成的可执行程序。 ## 查看源码 ``` <gdb>l ``` ### 如果要从第11行开始继续列源代码可以输入 ``` (gdb) list ``` # 重复上一条命令 也可以什么都不输直接敲回车,gdb提供了一个很方便的功能,在提示符下直接敲回车表示重复上一条命令。 # 开始执行程序 ``` start ``` # 一条一条地执行语句(不进入函数) ``` next命令(简写为n) ``` # 一条一条地执行语句(进入函数) ``` step命令(简写为s) ``` ## 加断点并运行 ``` <gdb> b 5 Breakpoint 1 at 0x4016b6:file 1.cpp,line 5. <gdb> r Starting Program:D:\\\\4-4\4-4/a.exe breakpoint 1,swap(a=3,b=4) at 1.cpp;5 其中b命令把断点设在了第5行,r命令运行程序,之后碰到断点并停止。 运行程序的命令是r(run),但会一直执行到程序结束 可以用b(break)命令设置断点让它停下来 ``` ## 查看调用栈 ``` <gdb> bt 这一步是关键。根据bt命令,调用栈中包含两个栈帧:#0和#1,其中0号是当前栈帧--swap函数,1号是它的“上一个”栈帧--main函数。在这里我们甚至能看到swap函数的返回地址 <gdb> p a 使用p命令可以打印变量值 up命令选择上一栈帧 q命令退出gdb ``` # 查看函数局部变量的值 ``` (gdb) i locals ``` # 查看main函数当前局部变量的值 先用frame命令(简写为f)选择1号栈帧然后再查看局部变量: ``` (gdb) f 1 #1 0x080483c1 in main () at main.c:14 14 result[0] = add_range(1, 10); (gdb) i locals result = {0, 0, 0, 0, 0, 0, 134513196, 225011984, -1208685768, -1081160480, ... -1208623680} ``` # 设置参数 ``` set args XXX ``` # 列出所有的断点 info break # 断点删除 ``` delete 用法:delete \[breakpoints num\] \[range...\] delete可删除单个断点,也可删除一个断点的集合,这个集合用连续的断点号来描述。 例如: delete 5 delete 1-10 clear 用法:clear     删除所在行的多有断点。     clear location clear 删除所选定的环境中所有的断点 clear location location描述具体的断点。 例如: clear list\_insert         //删除函数的所有断点 clear list.c:list\_delet   //删除文件:函数的所有断点 clear 12                  //删除行号的所有断点 clear list.c:12           //删除文件:行号的所有断点 clear 删除断点是基于行的,不是把所有的断点都删除。 ```