Gdb调试多进程程序
Gdb调试多进程程序
程序经常使用fork/exec创建多进程程序。多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方。Gdb功能强大,对调试多线程提供很多支持。
方法1:调试多进程最土的办法:attach pid
Attach是调试进程的常用办法,只要有可执行程序以及相应PID,即可工作。当然,为方便调试,可以在进程启动后,设定sleep一段时间,如30s,这样即可有充足的时间来attach。
方法2: set follow-fork-mode child + main断点
当设置set follow-fork-mode child,gdb将在fork之后直接执行子进程,知道碰到断点后停止。如何设置子进程的断点呢?在父进程中是无法知道子进程的地址空间的(只有等程序载入后方可知)。Gdb提供一个很方便的机制:main函数的断点将被子进程继承(毕竟main是任何程序的入口)。
注意:程序在main停下后,可尝试设置断点。断点是否有效,取决于gdb是否已经载入目标程序的地址空间。
方法3: set follow-fork-mode child + catch exec
Cache点是一种特殊的breakpoint。Gdb能够catch的事件很多,如throw/catch/exception/syscall/exec/fork/vfork等。其中和多进程关系最大的就是exec/fork事件。
举例:
GNU gdb Fedora (6.8-27.el5)Copyright (C) 2008 Free Software Foundation, Inc.(gdb) catch execCatchpoint 1 (exec)(gdb) set follow-fork-mode child(gdb) r -d ***Catchpoint 1 (exec'd /****/binary), 0x0000003c68800a70 in _start () from /lib64/ld-linux-x86-64.so.2(gdb) bt#0 0x0000003c68800a70 in _start () from /lib64/ld-linux-x86-64.so.2#1 0x0000000000000003 in ?? ()#2 0x00007fff65c6e85a in ?? ()#3 0x00007fff65c6e85d in ?? ()#4 0x00007fff65c6e860 in ?? ()(gdb) b lib.cc:8720No symbol table is loaded. Use the "file" command.(gdb) cContinuing(gdb) bt#0 0x0000003c68800a70 in _start () from /lib64/ld-linux-x86-64.so.2#1 0x0000000000000002 in ?? ()#2 0x00007fff1af7682a in ?? ()#3 0x0000000000000000 in ?? ()(gdb) b lib.cc:8720Breakpoint 2 at 0x15f9694: file lib.cc, line 8720.(gdb) cContinuing.[Thread debugging using libthread_db enabled][Thread 0x40861940 (LWP 12602) exited][Switching to process 12630]0x0000003c6980d81c in vfork () from /lib64/libpthread.so.0Warning:Cannot insert breakpoint 2.Error accessing memory address 0x15f9694: Input/output error.(gdb) bt#0 0x0000003c6980d81c in vfork () from /lib64/libpthread.so.0#1 0x000000000040c3fb in ?? ()#2 0x00002adeab604000 in ?? ()#3 0x01000000004051ef in ?? ()#4 0x00007fffff4a42f0 in ?? ()#5 0x686365746e6f6972 in ?? ()#6 0x0000000d0000000c in ?? ()#7 0x0000000b0000000a in ?? ()#8 0x0000000000000000 in ?? ()(gdb) delete 2 --此处当breakpoint无效时,必须删除,否则程序无法继续(gdb) cContinuing.[New process 12630]Executing new program: /****/binarywarning: Cannot initialize thread debugging library: generic error[Switching to process 12630]Catchpoint 1 (exec'd /****/binary), 0x0000003c68800a70 in _start () from /lib64/ld-linux-x86-64.so.2(gdb) bt#0 0x0000003c68800a70 in _start () from /lib64/ld-linux-x86-64.so.2#1 0x0000000000000009 in ?? ()Backtrace stopped: previous frame inner to this frame (corrupt stack?)(gdb) b lib.cc:8720Breakpoint 4 at 0x15f9694: file lib.cc, line 8720.(gdb) b type.cc:32Breakpoint 5 at 0x1693050: file type.cc, line 32.(gdb) cContinuing.(gdb) -- 和正常程序调试一样 |
说明:catch exec后,程序将在fork/vfork/exec处停下。并非每次停下后,设置断点都是有效的。如提供断点无效,需要删除,否则程序无法继续。要能够在新进程中设置断点,一定要等到新进程的地址空间被载入后,设置断点是才有效(exec将改变原程序的地址空间)。上述例子,主要想展示如何对新进程设置断点!
注意:
1)程序地址非常重要(代码和数据地址一样重要)。使用gdb时,多多注意和利用地址信息。
2)On some systems, when a child process is spawned by vfork, you cannot debug the child or parent until an exec call completes.
方法4:info inferiors/inferiors inferiors
设置set detach-on-fork off/set follow-exec-mode new。
If you choose to set `detach-on-fork' mode off, then gdb will retain control of all forked processes (including nested forks). You can list the forked processes under the control of gdb by using the info inferiors command, and switch from one fork to another by using the inferior command.
所使用的gdb不支持set detach-on-fork off/set follow-exec-mode new/info inferiors。不清楚。
Gdb调试多进程程序的更多相关文章
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- 用GDB调试多进程程序
在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...
- 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 显示当前可调试的所有线程 ...
随机推荐
- 烂泥:Postfix邮件服务器搭建之虚拟用户配置
virtual_gid_maps = static: virtual_transport = dovecot dovecot_destination_recipient_limit = 1 注意:po ...
- 1. 什么是Docker?
##### 一.什么是Dokcer?> Docker是一个开源项目, 诞生于2013年初, 最初是dotCloud公司内部的一个业余项目. 它基于Google公司推出的Go语言实现. 项目后来加 ...
- 13、Apache中虚拟目录和目录权限配置
一.虚拟目录 之前的个人主页,为了安全起见,需要把~yanji 用户隐藏起来,这时就可以设置个 虚拟目录. 它在Apache服务器应用比较多,能够隐藏系统的真实目录,实用性非常高. 虚拟目录主要 通过 ...
- java多线程系类:JUC原子类:03之AtomicLongArray原子类
概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...
- Excel到底最多可以有多少行
平时我们使用的Excel到底最多可以有多少行? 答案:1048576,如图在红框中输入此数字即可看见.
- js小数点失精算法修正
在用js计算0.07*100时候竟然=7.000000000000001 关于js失精算法你都遇到哪些,让我们一起来细数一下吧 console.log(0.07*100); // 7.00000000 ...
- 在iOS APP中使用H5显示百度地图时如何支持HTTPS?
现象: 公司正在开发一个iOSAPP,使用h5显示百度地图,但是发现同样的H5页面,在安卓可以显示出来,在iOS中就显示不出来. 原因分析: 但是现在iOS开发中,苹果已经要求在APP中的所有对外连接 ...
- ZH奶酪:自然语言处理工具LTP语言云调用方法
前言 LTP语言云平台 不支持离线调用: 支持分词.词性标注.命名实体识别.依存句法分析.语义角色标注: 不支持自定义词表,但是你可以先用其他支持自定义分词的工具(例如中科院的NLPIR)把文本进行分 ...
- FineUI小技巧(6)自定义页面回发
前言 FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件.但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做 ...
- 格雷码原理与Verilog实现
格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...