在子进程中sleep。然后attach上去。

gdb --pid=123456

ps出子进程的id,gdb attach 进程号.

http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

实际上,GDB 没有对多进程程序调试提供直接支持。比如。使用GDB调试某个进程,假设该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地执行下去。

假设你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。

那么该怎样调试子进程呢?事实上我们能够利用GDB的特点或者其它一些辅助手段来达到目的。此外。GDB 也在较新内核上增加一些多进程调试支持。

接下来我们具体介绍几种方法,各自是 follow-fork-mode 方法。attach 子进程方法和 GDB wrapper 方法。

follow-fork-mode

在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。

follow-fork-mode的使用方法为:

set follow-fork-mode [parent|child]

parent: fork之后继续调试父进程,子进程不受影响。

child: fork之后调试子进程。父进程不受影响。

因此假设须要调试子进程,在启动gdb后:

(gdb) set follow-fork-mode child

并在子进程代码设置断点。

此外还有detach-on-fork參数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:

set detach-on-fork [on|off]

on: 断开调试follow-fork-mode指定的进程。

off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,还有一个进程置于暂停(suspended)状态。 

注意。最好使用GDB 6.6或以上版本号,假设你使用的是GDB6.4,就仅仅有follow-fork-mode模式。

follow-fork-mode/detach-on-fork的使用还是比較简单的,但因为其系统内核/gdb版本号限制。我们仅仅能在符合要求的系统上才干使用。

并且,因为follow-fork-mode的调试必定是从父进程開始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,比如上图3进程系统,调试起来并不方便。

Attach子进程

众所周知,GDB有附着(attach)到正在执行的进程的功能,即attach <pid>命令。

因此我们能够利用该命令attach到子进程然后进行调试。

比如我们要调试某个进程RIM_Oracle_Agent.9i,首先得到该进程的pid

[root@tivf09 tianq]# ps -ef|grep RIM_Oracle_Agent.9i

nobody    6722  6721  0 05:57 ?        00:00:00 RIM_Oracle_Agent.9i

root      7541 27816  0 06:10 pts/3    00:00:00 grep -i rim_oracle_agent.9i

通过pstree能够看到,这是一个三进程系统,oserv是RIM_Oracle_prog的父进程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父进程。

[root@tivf09 root]# pstree -H 6722 

如今就能够调试了。一个新的问题是。子进程一直在执行,attach上去后都不知道执行到哪里了。

有没有办法解决呢?

一个办法是,在要调试的子进程初始代码中,比方main函数開始处,增加一段特殊代码。使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点。再把成立的条件取消,使代码能够继续运行下去。

至于这段代码所採用的条件,看你的偏好了。比方我们能够检查一个指定的环境变量的值,或者检查一个特定的文件存不存在。以文件为例,其形式能够例如以下:

void debug_wait(char *tag_file)

{

    while(1)

    {

        if (tag_file存在)

            睡眠一段时间;

        else

            break;

    }

}

当attach到进程后,在该段代码之后设上断点,再把该文件删除就OK了。

当然你也能够採用其它的条件或形式,仅仅要这个条件能够设置/检測就可以。

Attach进程方法还是非常方便的。它可以应付各种各样复杂的进程系统,比方孙子/曾孙进程,比方守护进程(daemon process)。唯一须要的就是增加一小段代码。

用GDB调试多进程程序的更多相关文章

  1. Gdb调试多进程程序

    Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...

  2. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  3. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  4. gdb常用命令及gdb调试多进程/线程程序&coredump

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

  5. gdb调试多进程多线程程序

    一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源 ...

  6. gdb调试多进程和多线程命令

     gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主 ...

  7. [转]gdb调试多进程和多线程命令

    1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...

  8. gdb调试多进程和多线程命令(转)

    1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...

  9. 使用gdb调试多线程程序总结

    转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...

随机推荐

  1. vs2012加载EntityFrameWork框架,连接Oracel

    近日公司用到.net MVC框架做接口,需连接到Oracel数据库,从网上查阅了一些资料,当然,从咱们博客园获益匪浅.然后结合自己所做,把使用过程中遇到的一些问题,及如何解决的整理如下,方便查阅,也有 ...

  2. 查询oracle表和sql数据量大小

    select t.TABLE_NAME,t.NUM_ROWS from user_tables t order by t.TABLE_NAME:--oracle  SELECT object_name ...

  3. windows下安装mysql笔记

    接着上几篇文章再来看下windows下安装mysql. 我这里是windows7 64位, 安装过程中还是遇到一些坑,这里记录下. 一.下载安装包 打开mysql官网下载页面:http://dev.m ...

  4. Class类相关

    Class类是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息 使用class类获得一个类相关的class类(注意得到的是class类,不是相关的类) ...

  5. HTML5 canvas中的转换方法

    转换方法 scale(scalewidth,scaleheight)                缩放当前绘图至更大或更小 scalewidth         缩放当前绘图的宽度 (1=100%, ...

  6. C# 缩略图算法

    代码写多了,有些使用过的方法和技巧会一时半会想不起来,平日记录下来,方便自己和有需要的人日后查阅. using (var stream = new FileStream(physicalPath, F ...

  7. sqlserver常用全局变量

    @@SERVERNAME    : 返回运行SQL Server 2000本地服务器的名称. @@REMSERVER       : 返回登录记录中记载的远程SQL Server服务器的名称. @@C ...

  8. Mysql主从复制的配置(双机互为主从)

    目的: 让两台mysql服务器可以互为主从提供同步服务. 优点: 1. mysql的主从复制的主要优点是同步"备份", 在从机上的数据库就相当于一个(基本实时)备份库. 2. 在主 ...

  9. sunJCE or ibmJce,was服务器下使用des的注意点

    最近开发了一个应用,在tomcat下一切ok,到was上有报错. 打开debug日志,没有异常?? 继续调查发现是我们的程序引用了一个sun很久以前的jar.这个jar需要单独打开message日志 ...

  10. OC 代码规范

    我们写出来的代码会给很多人看,为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范,Objective-C同样如此.   主要参考规范:   1. Google Objective-C Sty ...