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
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传给进程。