Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340952
  • 博文数量: 54
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 821
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-30 17:37
文章分类

全部博文(54)

文章存档

2015年(35)

2014年(19)

我的朋友

分类: C/C++

2015-09-11 18:06:41

  首先介绍一下如果程序已经运行了,如何调试正在运行的程序,这个对于调试正在运行的服务器程序非常有效,因为有些关键的服务器程序,一旦启动是不允许随便中止运行的,方法就是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) |
给主人留下些什么吧!~~