在linux环境下,编写应用程序,有句话说的“写一段代码,编译通过,半小时救过了;写一段代码编译没有通过,半天就过了”,这句话说的是调试代码所花费的时间远远会超过自己的预期,所以在linux环境下如何更好的调试自己的代码,对于提高工作效率无疑是一剂良药。
调试工具: gdb
1、很多时候,程序编译通过之后,运行却没有得到期望的结果,咋一看程序逻辑、代码都没有问题,这个时候就需要用到gdb了。
命令格式:gdb 程序名
root>/root> gdb ../bin/exename
回车运行之后,首先设置断点,命令格式:break 源程序文件名:行号, break 也可简写为b
root>/root> b a.c:80
回车运行,就可以通过 step 、 next 两个命令进行单步、下一步调试了
2、还有一些时候,程序编译通过之后,开始运行的一段时间都是没有问题的,特别是对于服务端程序,程序崩溃了,查无对症啊,这是最痛苦的时候,不过这个时候,我们设置linux环境,通过程序崩溃产生的core文件来进一步分析原因
命令:gdb 程序名 core文件名
root>/root> gdb ../bin/exename core.232123
回车运行之后,core文件时程序崩溃时将当时程序的内存映射到文件中了,崩溃绝大部分时候是因为内存出错了,所以在查看时,注意各个指针的值是否正常
root>/root> bt
该命令显示堆栈信息, 也可以用where
其他命令: info local 查看局部变量
print 打印
info register 查看寄存器变量
frame 跳到第几帧
3、服务端程序,几乎会用到多线程,对于多线程的调试也是最头疼的,下面总结了一些多线程调试的方法
如果多线程程序在运行过程中被挂起了,可能适用于锁的互斥引起的,这是可以:
gdb detach + pid 可以调试正在运行的进程
info thread
thread N 可以查看第n个线程 bt,调出堆栈信息
也可以 info thread ,切换到某个线程后, set scheduler-locking on/off 让其他线程挂起/运行