gdb tips (by hanlray(at)gmail.com)
gdb program
指定要调试的程序,进入gdb环境,但是并不运行该程序
break/b linespec
设置断点,linespec指定断点位置,可以用多种方式指定,如行号、函数名等
break/b linespec thread threadno
在指定的threadno上设置断点,断点只对该线程有效,不指定thread的断点是对所有线程有效的。
run
在gdb下运行该程序
schedule
当从断点处恢复执行时(不管是continue执行还是单步执行),OS继续进行正常的线程调度,直到下一个断点(对单步执行来说就是下一个语句),有时候这种调度可能会影响单步的调试,可以用
set scheduler-locking on
来关闭OS调度,用set scheduler-locking来查看当前值
signal
当被调试的进程进入running状态后,terminal由该进程控制,因此不会出现gdb提示符,这时如何和gdb交互呢(比如想添加一个断点)?必须停止该进程,使控制权回到gdb:
如果设置有断点,可以触发断点向gdb发送signal。最简单的方法就是用intr(Ctrl-C)字符产生SIGINT,因为gdb对SIGINT的处理是停止进程,不把该signal传递给进程,可以用info handle来查看当前gdb对signals的处理情况,如: Signal Stop Print Pass to program Description SIGHUP Yes Yes Yes Hangup SIGINT Yes Yes No Interrupt SIGQUIT Yes Yes Yes Quit Stop列表示是否停止进程,Print表示是否打印该signal,Pass to program列表示是否把该signal传给调试的进程
当gdb收到一个signal而停止进程后,传递signal到进程的动作还没有发生,此时可以用handle命令修改对signal的处理方式,当继续执行进程使才会根据当前的设置决定是否把该signal传给进程。