使用gdb调试的必要性
说实话,我平时都是用CLion编辑和调试代码的,但是CLion超级占内存的,程序还没跑内存一半先没了。。所以,用轻便的工具调试程序就变得超级必要——那就是gdb,可以打断点、单步调试、中途输出变量、回溯错误等,而且几乎不占什么内存。
假装我有个程序
这里我假设写了个图片处理程序(假设是 src/test.cpp),然后用CMakeList.txt配置并且把这个程序编译为目标 test_program,本来运行该程序所用的命令是:
./test_program img.png
调试开始
使用gdb之前先在CMakeList.txt加一句
set (CMAKE_BUILD_TYPE debug)
然后在命令行启用gdb开始调试
$ gdb ./test_program
用b打断点:
(gdb) b src/test.cpp:39
这句话是在 src/test.cpp的第39行打了个断点
为了讲解方便,我们假装39行开始是:
for(int i=0;i<AA.size();i++){
k=func(i);
}
用run开始运行该程序:直接在run后面接要用的参数就好:
(gdb) run img.png
这就相当于 ./test_program img.png 的调试模式了
然后程序会运行到39行暂停住,你此时可以用p输出想看的变量:
(gdb) p AA.size()
然后用c继续运行到下一次断点(由于这是个循环,它等下还是停在39行):
(gdb) c
Continuing.
用n执行下一行:
(gdb) n
用s可进入函数单步执行:
(gdb) s
(s是step缩写,其单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的)
如果想停止程序运行则按ctrl+c
然后用q可以退出调试:
(gdb) q