调试是开发过程中不可或缺的工作,在Linux编程中通常使用gdb来调试C/C++程序。
被调试的程序需要带调试信息
在调试某个程序时,为了能清晰地看到调试的每一行代码、调用的堆栈、变量名、函数名等信息,我们需要在调试程序中加上调试符号信息,即在使用gcc编译程序时需要加上-g 选项。
gcc -g -o hello_server hello_server.c
判断是否带有调试信息。gdb hello_server
除了不加-g选项,也可以使用 Linux的 strip命令移除某个程序中的调试信息.
strip hello_server
在实际生成调试程序时,我们一般不仅要加上-g 选项,也被建议关闭编译器程序的优化选项。编译器程序的优化选项一般有 5个级别,即 O0~O4(O0是字母 O加上数字0),其中,O0表示不优化(关闭优化),从O1到O4,优化级别越来越高,O4级别最高。关闭优化的目的是在调试时符号文件显示的调试变量等能与源代码完全对应。
启动gdb调试的方法
使用gdb调试一个程序一般有三种方法:gdb filename、gdb attach pid、gdb filename corename。
方法一 直接调试目标程序
gdb filename
filename是我们需要启动的调试程序文件名,这种方式会直接使用gdb启动一个程序进行调试,也就是说这个程序还没有启动。
方法二 attach到进程
一个程序已经启动,我们想调试这个程序,但又不想重启这个程序。
#获取chatserver程序的pid,然后attach
ps -ef | grep chateserver
gdb attach pidd
在使用gdb attach附加上目标进程后,调试器会暂停下来,此时我们可以使用continue命令让程序继续运行,若想调试完程序后结束此次调试,且不对当前进程chatserver有任何影响,也就是说想让这个程序继续运行,则可以在 gdb 的命令行界面输入 detach 命令让程序与 gdb 调试器分离。
方法三 调试core文件——定位进程崩溃问题
gdb filename corename