gdb调试多进程和多线程命令(转)
1. 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置
设置方法:set follow-fork-mode [parent|child] set detach-on-fork [on|off]
查询正在调试的进程:info inferiors
切换调试的进程: inferior <infer number>
添加新的调试进程: add-inferior [-copies n] [-exec executable] ,可以用file executable来分配给inferior可执行文件。
其他:remove-inferiors infno, detach inferior
2. GDB默认支持调试多线程,跟主线程,子线程block在create thread。
查询线程:info threads
切换调试线程:thread <thread number>
例程:
#include <stdio.h>
#include <pthread.h> void processA();
void processB();
void * processAworker(void *arg); int main(int argc, const char *argv[])
{
int pid; pid = fork(); if(pid != )
processA();
else
processB(); return ;
} void processA()
{
pid_t pid = getpid();
char prefix[] = "ProcessA: ";
char tprefix[] = "thread ";
int tstatus;
pthread_t pt; printf("%s%lu %s\n", prefix, pid, "step1"); tstatus = pthread_create(&pt, NULL, processAworker, NULL);
if( tstatus != )
{
printf("ProcessA: Can not create new thread.");
} processAworker(NULL);
sleep();
} void * processAworker(void *arg)
{
pid_t pid = getpid();
pthread_t tid = pthread_self();
char prefix[] = "ProcessA: ";
char tprefix[] = "thread "; printf("%s%lu %s%lu %s\n", prefix, pid, tprefix, tid, "step2");
printf("%s%lu %s%lu %s\n", prefix, pid, tprefix, tid, "step3"); return NULL;
} void processB()
{
pid_t pid = getpid();
char prefix[] = "ProcessB: ";
printf("%s%lu %s\n", prefix, pid, "step1");
printf("%s%lu %s\n", prefix, pid, "step2");
printf("%s%lu %s\n", prefix, pid, "step3"); }
输出:
[cnwuwil@centos c-lab]$ ./test
ProcessA: step1
ProcessB: step1
ProcessB: step2
ProcessB: step3
ProcessA: thread step2
ProcessA: thread step3
ProcessA: thread step2
ProcessA: thread step3
调试:
1. 调试主进程,block子进程。
(gdb) set detach-on-fork off
(gdb) show detach-on-fork
Whether gdb will detach the child of a fork is off.
(gdb) catch fork
Catchpoint (fork)
(gdb) r
[Thread debugging using libthread_db enabled] Catchpoint (forked process ), 0x00110424 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6.i686
(gdb) break test.c:
Breakpoint at 0x8048546: file test.c, line .
(gdb) cont
[New process ]
[Thread debugging using libthread_db enabled] Breakpoint , main (argc=, argv=0xbffff364) at test.c:
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6.i686
(gdb) info inferiors
Num Description Executable
process /home/cnwuwil/labs/c-lab/test
* process /home/cnwuwil/labs/c-lab/test
2. 切换到子进程:
(gdb) inferior
[Switching to inferior [process ] (/home/cnwuwil/labs/c-lab/test)]
[Switching to thread (Thread 0xb7fe86c0 (LWP ))]
# 0x00110424 in ?? ()
(gdb) info inferiors
Num Description Executable
* process /home/cnwuwil/labs/c-lab/test
process /home/cnwuwil/labs/c-lab/test
(gdb) inferior
[Switching to inferior [process ] (/home/cnwuwil/labs/c-lab/test)]
[Switching to thread (Thread 0xb7fe86c0 (LWP ))]
# main (argc=, argv=0xbffff364) at test.c:
(gdb) info inferiors
Num Description Executable
process /home/cnwuwil/labs/c-lab/test
* process /home/cnwuwil/labs/c-lab/test
3. 设断点继续调试主进程,主进程产生两个子线程:
(gdb) break test.c:
Breakpoint at 0x804867d: file test.c, line . ( locations)
(gdb) cont
ProcessA: step1
[New Thread 0xb7fe7b70 (LWP )]
ProcessA: thread step2 Breakpoint , processAworker (arg=0x0) at test.c:
(gdb) info inferiors
Num Description Executable
process /home/cnwuwil/labs/c-lab/test
* process /home/cnwuwil/labs/c-lab/test
(gdb) info threads
Thread 0xb7fe7b70 (LWP ) 0x00110424 in __kernel_vsyscall ()
Thread 0xb7fe86c0 (LWP ) 0x00110424 in ?? ()
* Thread 0xb7fe86c0 (LWP ) processAworker (arg=0x0) at test.c:
4. 切换到主进程中的子线程,注意:线程2为前面产生的子进程
(gdb) thread
[Switching to thread (Thread 0xb7fe7b70 (LWP ))]# 0x00110424 in __kernel_vsyscall ()
(gdb) cont
ProcessA: thread step3
ProcessA: thread step2
[Switching to Thread 0xb7fe7b70 (LWP )] Breakpoint , processAworker (arg=0x0) at test.c:
(gdb) info threads
* Thread 0xb7fe7b70 (LWP ) processAworker (arg=0x0) at test.c:
Thread 0xb7fe86c0 (LWP ) 0x00110424 in ?? ()
Thread 0xb7fe86c0 (LWP ) 0x00110424 in __kernel_vsyscall ()
(gdb) thread
转自:http://blog.csdn.net/pbymw8iwm/article/details/7876797
gdb调试多进程和多线程命令(转)的更多相关文章
- gdb调试多进程和多线程命令
gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主 ...
- [转]gdb调试多进程和多线程命令
1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- gdb常用命令及gdb调试多进程/线程程序&coredump
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- Gdb调试多进程程序
Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...
- 使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...
- gdb调试多进程多线程程序
一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源 ...
- 用GDB调试多进程程序
在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...
- GDB调试-从入门到实践
你好,我是雨乐! 在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工 ...
随机推荐
- hdu 1507(二分图匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Disruptor源码分析
本文将介绍Disruptor的工作机制,并分析Disruptor的主要源码 基于的版本是3.3.7(发布于2017.09.28) 水平有限,如有谬误请留言指正 0. 什么是Disruptor? Dis ...
- css-demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL*Loader-605: Non-data dependent ORACLE error occurred — load discontinued
It seems the tablespace is full.
- jmeter 线程组之间的参数传递
http://www.cnblogs.com/wnfindbug/p/5817277.html 场景测试中,一次登录后做多个接口的操作,然后登录后的uid需要关联传递给其他接口发送请求的时候使用. 1 ...
- [Contest20171102]简单数据结构题
给一棵$n$个点的数,点权开始为$0$,有$q$次操作,每次操作选择一个点,把周围一圈点点权$+1$,在该操作后你需要输出当前周围一圈点点权的异或和. 由于输出量较大,设第$i$个询问输出为$ans_ ...
- Swift数独游戏优化——C++与OC混编、plist自动生成
一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的. 但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Termin ...
- Ubuntu 16.04下Shell脚本中使用数组提示:Syntax error: "(" unexpected
说明:这种现象在CentOS中不会出现. 分析: 可以看出sh指向了dash 解决方式: 1.不要用sh执行,使用./test.sh执行.或者bash执行. 2.根治,直接修改sh的指向,改成bash ...
- Word调整表格大小
在Word文档中创建表格后,用户往往需要根据输入的内容调整表格的行高和列宽,有时也需要对整个表格的大小进行调整. 在选择的表格上右击,选择快捷菜单中的“自动调整”—“根据内容调整表格”命令,Word将 ...
- Asp.Net生命周期和Http管道技术
本篇主要介绍一下内容: 1.ASP.NET生命周期 2.Http运行时 3.Http管道技术 a)inetinfo.exe b)asp.net_isapi.dll c)aspnet_wp.exe d) ...