问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux中怎么使用gdb调试进程有dettach

发布网友 发布时间:2022-04-21 23:15

我来回答

1个回答

热心网友 时间:2022-04-07 19:47

  在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。  follow-fork-mode的用法为:  set follow-fork-mode [parentchild]  parent: fork之后继续调试父进程,子进程不受影响。  child: fork之后调试子进程,父进程不受影响。  因此如果需要调试子进程,在启动gdb后:  (gdb) set follow-fork-mode child并在子进程代码设置断点。  此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:  set detach-on-fork [onoff]  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 -efgrep 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通过 pstree 察看进程  启动GDB,attach到该进程  用 GDB 连接进程  现在就可以调试了。一个新的问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。有没有办法解决呢?  一个办法是,在要调试的子进程初始代码中,比如main函数开始处,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。  至于这段代码所采用的条件,看你的偏好了。比如我们可以检查一个指定的环境变量的值,或者检查一个特定的文件存不存在。以文件为例,其形式可以如下:  void debug_wait(char *tag_file)  {  while(1)  {  if (tag_file存在)  睡眠一段时间;  else  break;  }  }当attach到进程后,在该段代码之后设上断点,再把该文件删除就OK了。当然你也可以采用其他的条件或形式,只要这个条件可以设置/检测即可。  Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。  GDB wrapper  很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。它的优点是不用添加额外代码。  其基本原理是以gdb调用待执行代码作为一个新的整体来被exec函数执行,使得待执行代码始终处于gdb的控制中,这样我们自然能够调试该子进程代码。  还是上面那个例子,RIM_Oracle_prog fork出子进程后将紧接着执行RIM_Oracle_Agent.9i的二进制代码文件。我们将该文件重命名为RIM_Oracle_Agent.9i.binary,并新建一个名为RIM_Oracle_Agent.9i的shell脚本文件,其内容如下:  [root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary  [root@tivf09 bin]# cat RIM_Oracle_Agent.9i  #!/bin/sh  gdb RIM_Oracle_Agent.binary当fork的子进程执行名为RIM_Oracle_Agent.9i的文件时,gdb会被首先启动,使得要调试的代码处于gdb控制之下。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
步步高学习机@iboxH2 H2学习机的屏幕大小? 6-7万左右纯电 女生想买台便宜的小车在城市代步,有什么好推荐?电动车最好? 河南德盛智能环保科技有限公司怎么样? 深圳市德盛铭电科技有限公司怎么样? pvc防水门生产厂家哪个好呢? 晋江市德顺陶瓷建材有限公司简介 酒店家具厂家 梨子酿酒最简单的方法 用去世老人的黑白照做朋友圈背景墙不好吗 贵人道运道36度500ml多少钱一瓶? 贵人道酒多少钱一箱 linux gdb调试怎么开始调试 朋友发的很丧的朋友圈要不要点赞? 请问高手们用什么软件监控局域网内某个电脑访问外... 贵人道酒的经典V6多少钱一箱?每箱十二瓶装的 Linux:如何使用gdb调试多进程多线程程序 大家有没有什么好的看外网软件,麻烦推荐一下,发... 贵人道印象沂蒙2斤装52度多少钱? 有没有对外网电脑监控的软件 贵人道42度6瓶装多少钱一箱? 朋友圈里的丧是啥意思 如何实现内网监控外网,需要什么软件,进行什么设... 贵人道酒53度多少钱 不换朋友圈图像的人的性格 贵人道红贵36度价格 企业被列入经营异常名录要多长时间 外网(使用什么软件) 贵人道36度多少钱一箱贵人道36度经典幸福版多少钱一箱 贵人道 紫贵 酒 多少钱 蓝色盒子哪种 39度的 为什么有些人的朋友圈背景是全灰色的,为什么弄这样? 如何使用linux下gdb来调试python程序 贵人道36度人生共荣耀幸福版多少钱一箱 linux下项目工程如何使用gdb调试工具 贵人道36°财酒和韵酒哪个好喝!多少钱一箱?多谢 11月13日出生的人是什么星座,上升星座是什么,守护... gdb 调试,求指教 酒。的价格? 贵人道,这酒多少钱一箱。 红贵呢? 黄... 1992年11月6日早上6点多的天蝎座上升星座是什么星座 linux 下面怎么用gdb调试多个.c文件? 天蝎座11月9日的上升星座 11月7号下午6点天蝎座的上升星座是什么 怎么在linux系统下调试程序 1968年11月11日早上8点45分天蝎座上升是什么星座? linux系统怎么使用gdb调试?输出断点位置的变量值... 11月10日的天蝎是什么上升星座? 怎样在linux系统中安装gdb调试工具? 我是11月18的天蝎座。上升星座。月亮星座是什么? 在linux下怎样用GDB调试make编译的程序?