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调试方面的文章,今天借助此文,分享一些工 ...
随机推荐
- matlab保存图片成eps格式不全,导致latex中图片显示不全的问题
我们经常会遇到这样的问题.用将matlab生成的图保存EPS格式后,用GSVIEW打开后,可以看到图片显示不全.遇到这种情况是,我们可以使用dvipdf——dvips的方法来生成PDF,这样生成的pd ...
- Android 登录界面调用输入法时让界面自动上移,使输入法不会遮挡到主界面(Activity)
先贴上效果图: <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:andr ...
- [BZOJ2667][cqoi2012]模拟工厂 贪心
2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 367 Solved: 184[Submit][Status] ...
- jquery插件需要明白的那些知识点
1.jquery中$是神马?$.fn又是神马? 稍微有jquery经验的都知道在jquery中$等价于jQuery,在控制台一试便知: 我们在jquery(1.8.3)源码中也能找到下面代码: 其实在 ...
- Codeforces 810 A.Straight «A»
A. Straight «A» time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- STL优先队列——踩坑日记
priority_queue 可以定义STL中的优先队列,但是优先队列在应用于自己定义的类型时需要重载<运算符,或者通过仿函数来定义比较方法,在定义比较方法的过程中,比较大的坑是STL中对于参数 ...
- Dijkstra【p4943】密室
Description 密室被打开了. 哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n.所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通 ...
- 13test02:阶乘
//假设32位int型变量y是表示最大人数的x的阶乘,即y=x!,当x最大值取什么时,y取最大值 //,且乘法不溢出. #include<iostream> using namespace ...
- Java静态static工具类线程安全问题研究
针对静态方法有以下一些前提: 静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自 ...
- 在C#中快速查询文件
相信使用过Everything的人都对其超快的搜索速度印象非常深刻,它的主要原理是通过扫描NTFS磁盘的USN Journal读取的文件列表,而不是磁盘目录,由于USN Journal非常小,因此能实 ...