今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表:

这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的。

一、多进程调试的命令

1、set follow-fork-mode parent|child

因为gdb在一般情况下,只会调试主进程。这条命令就可以使gdb来实现多进程的调试,进入gdb后默认调试的是parent,要想调试child的话,需要设置set follow-fork-mode child,然后进入调试。当然这种方式只能同时调试一个进程。

show follow-fork-mode就是查看当前调试的fork的模式。

2、detach-on-fork on|off:

设置为on,只调试父进程或子进程其中一个,需要根据follow-fork-mode决定,这是默认模式。

设置成off,父子进程都在gdb的控制之下,其中一个进程正常调试,需要根据follow-fork-mode决定,另一个进程会被设置为暂停状态。

GDB将每一个被调试程序的执行状态记录在一个名为inferior的结构中。一般情况下一个inferior对应一个进程,每个不同的inferior有不同的地址空间。inferior有时候会在进程没有启动的时候就存在。

3、info inferiors:

这条语句是为了显示GDB调试的所有inferior,GDB会为他们分配ID。其中带有*的进程是正在调试的inferior。

4、inferior num:

切换需要调试的进程的id

5、add-inferior [-copies n] [-exec executable]:

增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。

6、clone-inferior [-copies n] [infno]:

复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior。如果不指定infno,则就复制正在调试的inferior。

7、detach inferior infno:

detach掉编号是infno的inferior。注意这个inferior还存在,可以再次用run命令执行它

8、kill inferior infno:

kill掉infno号inferior。注意这个inferior仍然存在,可以再次用run等命令执行它

9、remove-inferior infno:

删除一个infno号的inferior。如果inferior正在运行,则不能删除,所以删除前需要先kill或者detach这个inferior

10、set schedule-multiple on|off:

设为off:只有当前inferior会执行。

设为on:全部是执行状态的inferior都会执行。

这个选项类似于多线程调试里的set scheduler-locking选项

如果scheduler-locking是指为on,即使schedule-multiple设置为on,也只有当前进程的当前线程会执行。

11、set follow-exec-mode new|same:

设置same:当发生exec的时候,在执行exec的inferior上控制子进程。

设置为new:新建一个inferior给执行起来的子进程。而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。

show follow-exec-mode:查看follow-exec-mode设置的模式。

12、set print inferior-events on|off:用来打开和关闭inferior状态的提示信息。

show print inferior-events :查看print inferior-events设置的状态。

13、maint info program-spaces:

用来显示当前GDB一共管理了多少地址空间。

二、多进程的代码

#include

#include

#include

#include

#include

int main()

{

pid_t id = fork();

if(id < 0)

{

perror("fork error!");

return -1;

}

else if(id == 0)

{

printf("child is: %d,father is: %dn",getpid(),getppid());

}

else

{

sleep(1);

printf("father is :%dn",getpid());

wait(NULL);

}

return 0;

}

三、调试情况

在编译的时候别忘了加上 -g(我刚开始就是犯了这样的错……)

1、设置调试的模式:

2、这是查看两个进程的情况:

如果大家需要切换要调试的进程可以使用上面我们提到过得命令:inferior 进程id这样就可以切换者调试其他的进程了。

注意:我们看见的进程前的*号,就表示当前正在调试的进程。

linux中多进程调试,linux下用gdb调试多进程相关推荐

  1. 深入探讨:linux中遍历文件夹下的所有文件

    深入探讨:linux中遍历文件夹下的所有文件 http://www.jb51.net/article/37664.htm

  2. TP6.0 调试模式下关闭Trace调试

    1. 在 TP6.0 当前最新版 (v6.0.7) 中 默认安装的时候会自动安装 topthink/think-trace 扩展 在调试模式下浏览器右下角会出现trace信息, 此时无法手动关闭 Tr ...

  3. linux下使用gdb调试崩溃和死锁实例

    gdb是linux下一款功能强大的调试工具,windows下对应的有windbg,下面举例说明常见程序错误解决方法 1.gdb启动 要想使用gdb调试,编译时指定-g选项加入调试信息,gdb可以启动执 ...

  4. Linux 下使用 gdb 调试 core 文件

    1.core文件 当程序运行过程中出现段错误(Segmentation Fault),程序将停止运行,由操作系统把程序当前的内存状况存储在一个 core 文件中,即核心转储文件(Coredump Fi ...

  5. Linux(Ubuntu)下嵌入式gdb调试环境

    系统原理课实验要做CMU的Bomblab实验,然而bombg文件在arm架构,因此要配置一个交叉编译/调试环境,曾测试在Ubuntu 15.04下直接安装arm-none-eabi-gdb,然而调试时 ...

  6. Linux下的gdb调试makefile的编写

    1.gdb调试 gdb就是用于调试可执行文件,要想让程序在调试的时候有提示信息在生成文件时加上-g (1)启动gdb:gdb +包含调试信息的应用程序 (2)l(只能查询包含在可执行程序里边的.c文件 ...

  7. LINUX下的gdb调试方法

    首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...

  8. linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

    2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...

  9. linux嵌入式gdb调试指南,建立嵌入式gdb调试环境

    一.下载gdb-6.4.tar.gz源代码 http://ftp.gnu.org/gnu/gdb/ 二.编译 GDB #tar zxvf gdb-6.4.tar.gz 2.1.编译GDB Server ...

最新文章

  1. 过椭圆外一点引两条切线方程_椭圆的一些结论汇总
  2. 读书笔记---编译程序中的三板斧
  3. 光流 | 光流交流群
  4. 性能测试:服务器配置清单分析
  5. linux网络子系统分析(四)—— INET连接建立API分析之connect/accept
  6. 小米max2刷android p,小米max2刷LineageOS记录
  7. Jaas demo 登陆验证
  8. STM32单片机远程升级
  9. 实对称矩阵必可正交对角化证明
  10. ppt文件太大怎么压缩
  11. EPUB、CAJ 、PDF 格式的区别,有什么好用的epub阅读器
  12. 网站地图制作百度地图google地图制作方法
  13. 远程办公何时了,网络打洞帮你搞
  14. 手机兼容性测试--testin云测流程
  15. 编程之美 1.8 小飞的电梯调度算法
  16. 计算机义讲活动总结,计算机社团活动总结.pdf
  17. 算法图解第一章——算法简介
  18. 人工智能领域所有技术,主要会有哪几种?
  19. 终于可以把两个合旋连在一起弹了
  20. (集思广益)区分ipv6奇偶地址

热门文章

  1. Apache Ant 1.9.13和1.10.5发布–支持Java 11单文件源程序
  2. Java 8过滤器,地图,收集和流示例
  3. jboss eap 7.0_创建委托登录模块(用于JBoss EAP 6.1)
  4. 雅虎yql_从RSS Feed和YQL创建数据表
  5. hadoop矩阵乘法源码_使用Hadoop计算共现矩阵
  6. 如何掌握Java内存(并保存程序)
  7. 我们如何意外地将Hibernate的JDBC流量增加了一倍
  8. 受JAAS保护的JAX-RS端点
  9. 使用Apache Camel发布/订阅模式
  10. 从Java执行可执行的命令行