`
dawning126
  • 浏览: 44949 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gdb多线程/多进程(守护进程)调试

阅读更多



一 调试多进程
1) follow-fork-mode :


set follow-fork-mode [parent|child]

parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。


在使用如下方法设置完要调试的程序后:



gdb命令行的 –-args 参数
gdb环境中 set args命令。
gdb --pid=PID(ps -ef | grep your_prog)


如果需要调试子进程,在启动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)状态。
由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,调试起来并不方便。

2) attach调试:
GDB有附着(attach)到正在运行的进程的功能,即attach <pid>命令。因此可以利用该命令attach到子进程然后进行调试。通过ps和pstree可以查看到所要调试的子进程pid。

问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。一个办法是,在要调试的子进程初始代码中,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。

Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。适合于各种复杂情况,特别是守护进程。

3) gdb wrapper:
专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。

可参考:http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

二 调试多进程
GDB多线程调试的基本命令:

info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION]  在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command  让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
other:
gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:


(gdb) set $i = 0
(gdb) p a[$i++]

调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了
info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro – 你可以查看宏展开的样子。
x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
x/x 以十六进制输出
x/d 以十进制输出
x/c 以单字符输出
x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
x/s 以字符串输出
command命令,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。
(gdb) command 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>print arg1
>print arg2
>print arg3
>end
(gdb)
参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html

http://coolshell.cn/articles/3643.html
分享到:
评论

相关推荐

    后台开发核心技术与应用实践

    第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...

    后台开发的一些源代码

    第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...

    徐晓鑫后台开发技术实践——腾讯

    第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式; 第五部分(第12章)主要是HTTP协议的...

    后台开发 核心技术与应用实践

    第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...

    嵌入式Linux应用程序开发标准教程(第2版全)

    第9章 多线程编程 9.1 Linux线程概述 9.1.1 线程概述 9.1.2 线程机制的分类和特性 9.2 Linux线程编程 9.2.1 线程基本编程 9.2.2 线程之间的同步与互斥 9.2.3 线程属性 9.3 实验内容——“生产者消费者”实验 9.4 本...

    leetcode中国-xinh79.github.io:我的个人博客

    守护进程 线程 线程同步 网络编程 select-poll epoll多路I/O模型 广播与组播 Libevent 基础 文件I/O 文件 函数 I/O库 数据文件和信息 进程环境 进程控制 信号 线程 线程控制 高级I/O 进程间通信 网络套接字 详细信息...

    linux programming instances网络编程教程 附源代码

    实例十 守护进程 实例十一 普通文件传输协议(tftp) 附录 附录一 gcc命令选项 1.使用语法 2.选项 附录二 makefile文件的编写方法 1.makefile文件的基本结构 2.makefile文件编写规则 3.makefile变量 4.假象...

    嵌入式Linux应用程序开发详解

    第9章 多线程编程 279 9.1 Linux下线程概述 279 9.1.1 线程概述 279 9.1.2 线程分类 280 9.1.3 Linux线程技术的发展 280 9.2 Linux线程实现 281 9.2.1 线程基本操作 281 9.2.2 线程访问控制 ...

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

     7.3 Linux守护进程   7.4 实验内容   本章小结   思考与练习  第8章 进程间通信   8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验...

    清华大学Linux操作系统原理与应用

    4.5.2 页面交换守护进程kswapd 99 4.6 内存管理实例 99 4.6.1 相关背景知识 100 4.6.2 代码体系结构介绍 100 4.6.3 实现步骤 103 4.6.4 程序代码 103 习题4 108 第5章 中断和异常 110 5.1 中断的基本知识 110 5.1.1 ...

    Linux程序设计 第4版.haozip01

    15.3.1 因特网守护进程(xinetd/inetd) 531 15.3.2 套接字选项 533 15.4 多客户 534 15.4.1 select系统调用 537 15.4.2 多客户 540 15.5 数据报 543 15.6 小结 545 第16章 用gtk+进行gnome编程 546 16.1 x...

    Linux程序设计 第4版.haozip02

    15.3.1 因特网守护进程(xinetd/inetd) 531 15.3.2 套接字选项 533 15.4 多客户 534 15.4.1 select系统调用 537 15.4.2 多客户 540 15.5 数据报 543 15.6 小结 545 第16章 用gtk+进行gnome编程 546 16.1 x...

    Linux:Operating_system_knowledge

    gdb调试 makefile 系统IO函数和文件操作函数 进程 函数族 进程间通信 信号 守护进程 线程 form 2021.3 to now study including socket套接字实现客户端与服务器端的通信 简单的多进程并发服务器实现 I/O复用 线程池

    宋劲彬的嵌入式C语言一站式编程

    34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. 线程的概念 2. 线程控制 ...

    Python Cookbook

    17.5 在多线程环境中使用SWIG生成的模块 603 17.6 用PySequence_Fast将Python序列转为 C数组 604 17.7 用迭代器逐个访问Python序列的元素 608 17.8 从Python可调用的C函数中返回None 611 17.9 用gdb调试动态载入...

Global site tag (gtag.js) - Google Analytics