在子进程中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. js添加onclick函数

    document.getElementById('Add').setAttribute("onclick",AddNum()); 相当于不停的调用Addnum函数 应改成docum ...

  2. Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

    本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...

  3. 连接、关联、JOIN、APPLY(SQL Server)

    连接方式 连接类型 个人总结 阐述(生成两个集合的约束笛卡儿积) INNER    JOIN 内连接 关联相同的(用于查找关联的信息) FROM C AS c INNER JOIN D AS d ON ...

  4. 【转】C++箴言:理解typename的两个含义

    [转载]http://dev.yesky.com/13/2221013.shtml 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不 ...

  5. 控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了

    控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了,就是按钮上的或其他控件上的图片哪里去了?

  6. mongo学习整理

    mongo做为NOSQL家族中一员,被广泛使用以及应用到生产环境中,有其出色的性能.关系型数据库(RDBMS )在互联网中依然是不可替代的一部分,mongo基于NOSQL的特性,在程序中RDBMS不适 ...

  7. vim编辑器中撤销和恢复操作

    在VIM编辑器下切换至命令行模式: 撤销: u 恢复: ctrl + r

  8. NVIDIA 显卡温度提示过高,显卡温度高99度怎么办?

    你可能没有在意您的NVIDIA(英伟达)显卡温度,那么你就不会知道显卡温度过高如何导致的呢?也不会知道如果去解决显卡温度过高的问题了,在此我希望在电脑玩游戏或者在办公中电脑速度快慢,或者发热的情况下, ...

  9. UCOS 杂项 笔记

    1.  建立任务和建立数据队列  哪个先建立? 经过试验得知,数据队列和任务的建立先后没有顺序,都可以正常运行. 2.关于主函数的面试问题. 主函数写法有:   int  main()    和voi ...

  10. 清除oracl中有主外键关联的表中的部分数据。

    1.禁用主外键BEGINfor c in (select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||constraint_name||' ...