在子进程中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. asp.net微信开发第二篇----消息应答

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上. 请注意: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接 ...

  2. (转)SVN源码管理(上&下)

    原文地址:http://www.cnblogs.com/IPrograming/archive/2012/12/15/SVN_1.html 使用SVN进行源码管理(上) 在原来的项目中使用的源码管理工 ...

  3. Nginx配置域名跳转实例

    要求:浏览器地址栏输入qj.123.com之后,地址自动变成qj.abc.com 配置nginx跳转 server { listen 80; server_name qj.abc.com qj.123 ...

  4. libthrift0.9.0解析(四)之TThreadPoolServer&ServerContext

    TThreadPoolServer直接继承自TServer,实现类serve和stop操作. 在serve中可以接受多个连接,每个连接单独开一个线程进行处理,在每个线程中,按顺序处理该线程所绑定连接的 ...

  5. Swift - 40 - 枚举更加灵活的使用方式

    //: Playground - noun: a place where people can play import UIKit /* 这里的枚举没有给它的成员默认值, 而是给它绑定了一个类型, 之 ...

  6. CAGradientLayer实现色差动画

    效果图: 代码部分: RPGradientAnimationView.h #import <UIKit/UIKit.h> typedef enum : NSUInteger { RPGra ...

  7. 常用命令常用sql:SHOWVARIABLESLIKE'character%'

    mysql学习笔记-常用命令 常用sql: SHOW VARIABLES LIKE 'character%';查看字符集SHOW VARIABLES LIKE 'collation_%';show e ...

  8. poj1182 并查集

     题目连接:http://poj.org/problem?id=1182 基础并查集,需要维护与根节点关系,解析见代码: /* poj 1182 并查集 思路分析:让你分析这些话里面多少假的 只需要用 ...

  9. C语言编程的进制问题问题

    在我们的编译器,我用的是ADS   开发平台,现在RTC模块编程时,2410作为上位机,如下代码: n = rBCDDATE;if(n==1) time->day =0x31 ; 波斯历的日期与 ...

  10. Xcode 如何设置 自动内存管理 转换为 手动内存管理

    建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...