用GDB调试多进程程序
在子进程中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调试多进程程序的更多相关文章
- Gdb调试多进程程序
Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- gdb常用命令及gdb调试多进程/线程程序&coredump
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- gdb调试多进程多线程程序
一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源 ...
- gdb调试多进程和多线程命令
gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主 ...
- [转]gdb调试多进程和多线程命令
1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...
- gdb调试多进程和多线程命令(转)
1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...
- 使用gdb调试多线程程序总结
转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...
随机推荐
- (转)Discuz!NT图文安装教程
不同目录下的安装方法根据目前大家对论坛的使用需求,在安装上面大致有三种情况,站点根目录下安装,站点虚拟目录下安装和站点子目录下安装. 1.根目录安装 根目录安装是最简单也是稳定系数最高的安装和使用方式 ...
- ManagedPipelineHandler IIS
IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandl ...
- 连接、关联、JOIN、APPLY(SQL Server)
连接方式 连接类型 个人总结 阐述(生成两个集合的约束笛卡儿积) INNER JOIN 内连接 关联相同的(用于查找关联的信息) FROM C AS c INNER JOIN D AS d ON ...
- BetWeen和模糊查询
--区分大小写性能比较低select * from Students where Age >1 and Age <4select * from Students where Age bet ...
- 武汉科技大学ACM:1007: 陶陶摘苹果
Problem Description 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹 ...
- Java学习笔记——实现一个简易记事本Notepad的编写
记事本功能介绍 1. 新建:记事本清空. 2. 打开:可打开笔记本上任意文本文件. 3. 保存:将文件保存至当前文件夹. 4. 另存为:将文件保存至任意位置. 5. 退出:退出时确 ...
- CentOS 7 之安装Mono&MonoDevelop
之前在园子里看过一篇文章说的是在CentOS 7上安装MonoDevelop的,一直想照着弄一遍都没有弄,今天深圳外面下暴雨,就在家里弄一下这个吧,以后也试着在Linux上面写写C#玩玩.这一试,还真 ...
- nginx虚拟配置
server { listen 8080; server_name www.manihome.com ; root "D:/WWW/mnmnh_2015"; location / ...
- [算法]动态规划(Dynamic programming)
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...
- mysql巡检脚本
#!/usr/bin/env python3.5 import psutil import mysql.connector import argparse import json import dat ...