首先介绍一下如果程序已经运行了,如何调试正在运行的程序,这个对于调试正在运行的服务器程序非常有效,因为有些关键的服务器程序,一旦启动是不允许随便中止运行的,方法就是attach命令,首先需要用ps命令检查当前运行的进程,找到需要调试的进程,记住它的
PID:
下面罗列一下具体命令:
attach PID
stop //暂停预调试的子进程,设置断点,观察点等等
b
c //运行程序,并在设置的断点处停住
step
next //step和next这一对命令是为了单步进入函数调试及从函数中出来。
其他过程与gdb调试单步程序并无区别
如果程序还没有运行,那么有另外一种方式,进入gdb后,敲命令:
set follow-fork-mode [parent|child]
-
parent: fork之后继续调试父进程,子进程不受影响。
-
child: fork之后调试子进程,父进程不受影响。
set detach-on-fork [on|off]
-
on: 断开调试follow-fork-mode指定的进程。
-
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
如果输入的是set detach-on-fork命令,那么就可以通过inferior <PID>在两个进程之间不断切换
调试线程的有如下的命令
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
-
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
-
on 只有当前被调试程序会执行。
-
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
如果不设定,或是敲set scheduler-locking off命令,就可以用thread<TID>命令在两个线程之间切换
info inferiors //查看当前运行的进程
info threads //查看当前运行的线程
参考资料:
http://blog.csdn.net/pbymw8iwm/article/details/7876797
阅读(1337) | 评论(0) | 转发(0) |