cpp调试技巧
-
编译时,需要带上
-g参数: -
进入调试:
参考资料
掌握gdb调试从入门到进阶(一) 掌握gdb调试从入门到进阶(二) gdb 相关命令 《100个gdb小技巧》 在文件行号上打断点 | 100个gdb小技巧
GDB常用命令
启动调试
run。一直执行程序,直到执行到断点处或结束。start。执行到main()函数起始位置。
断点
缩写b
- 跟行号。b <line_num>或者b <file_path>:<line_name>,比如b a/file.c:6。
- 跟函数名。b <func_name>或者b <file_path>:<func_name>。
- 条件断点。break <...> if condition,中间<...>表示上述命令。比如b <line_num> if <condition>。
- 查看断点。info break,缩写i b。
- 删除断点。
- delete <break_num>,缩写d <break_num>。其中,<break_num>为i b查询到的断点序号。
- clear <line_num>。其中,<line_num>为行号,可以为line_num/file:line_num等形式。
单步命令
next,缩写n。执行下一句,调用其它函数时不进入。step,缩写s。执行下一句,调用其它函数时进入,step into。continue,缩写c。停止后,继续执行,直到遇到下一个断点或执行结束。finish,缩写f。跳出本层函数,也即一直执行,直至当前函数完成,打印当前的堆栈信息和返回值。util,缩写u。循环体内一直执行,直至退出循环体。stepi和nexti,缩写si和ni。机器指令的单步命令。
查看
frame,缩写f。显示当前所在的行及相关信息。list,缩写l。显示当前程序运行位置附近的相关代码。-
print,缩写p。-
动态数组,比如
查看该动态数组的值:p *array@len更多参见: - gdb pretty print
-
-
watch,缩写w。观察的变量在变化时,就停止程序。
在macOS上使用GDB
https://zhuanlan.zhihu.com/p/68398728
其它技巧
GDB调试时传入可执行文件的参数
使用--args参数:
参见:How do I run a program with commandline arguments using GDB within a Bash script?
批量杀死进程
https://www.coder4.com/archives/1334 https://stackoverflow.com/questions/3510673/find-and-kill-a-process-in-one-line-using-bash-and-regex
macOS进入GDB之后进程挂起
例如:
解决方法:
https://apple.stackexchange.com/questions/420492/gdb-hangs-after-new-thread-on-macos
或者,将下述命令写入~/.gdbinit:
macOS上使用GDB参考文档: