gdb调试多进程与多线程

break 行号:设置断点

clean 行号:清除断点

info break:显示断点

finish:退出函数

bt:查看函数堆栈

break 函数名,在函数的位置设置断点

delete breakpoint 删除所有的断点

disable/enable breakpoint 1 使能断点

多进程的调试第一个方法:

通过 set detach-on-fork off  实现同时调试两个进程,一个在运行一个阻塞在fork处

通过set follow-fork-mode parent/child设置是调试父进程还是子进程

设置完之后,查询正在调试的进程 info inferior

切换到正在调试的进程 inferior number(前面的数字不是进程号)

在切换过去的进程设置断点,c执行就可以

第二种方法:可以方便的调试任意种进程

通过attach 进程号

通过这个进行调试的时候,一般要在进程的开始位置设置让其休眠一段时间方便attach,这个运行的时候需要root权限。进程号的获取可以通过 pstree -ap | prep pthread

也要在进程的位置设置断点 切换过去 c执行

多线程调试:

首先进行设置set scheduler-locking on

在线程的入口函数或者入口函数内部设置断点,

程序向下执行,直到产生线程(不能设置了断点就直接c)

info thread

通过thread 2跳到指定的线程

c执行

内部调试

调试完返回主线程

#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 != 0)
    processA();
  else{
  	sleep(20);
  	processB();
  }
//    processB();

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 != 0 )
    {
    printf("ProcessA: Can not create new thread.");
    }

//  processAworker(NULL);
  sleep(1);
  }

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");

  }

线程调试步骤:

1.start

2.set scheduler-locking on

3.b 50(线程的内部)

4.n 直到产生新的线程

5.info thread

6.thread 2

7.c

8.n

9thread 1

还有一个命令:

thread apply id1 id 2 command

进程的调试:

1.start

2.set detach-on-fork off

3.b processB(可以设置这个函数)

4.n

5.info inferior

6.inferior 2

7 c

如果想换一个进程

inferior 其他进程号

二:首先在想调试的进程前部设置等待时间

1.sudo gdb pthread

2.b 60 (要设置到内部)

3.fork之后 pstree -ap| grep pthread

4.attach 调试的进程号

5. c

6.内部调试

时间: 2024-10-18 01:10:32

gdb调试多进程与多线程的相关文章

gdb调试多进程和多线程命令

gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可. follow-fork-mode  detach-on-fork   说明 pare

使用 GDB 调试多进程程序

GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 ([email protected]), 软件工程师, IBM中国软件开发中心 2007 年 7 月 30 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大.对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统: 进程

gdb调试多进程多线程程序

一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源程序 list - 显示当前行前面的源程序 2.run(r):运行命令 run args run命令可以直接接命令行参数值,也可以在执行run之前通过 set args + 参数值实现 3.break(b):打断点 b linenum   在某行打断点 b +offset/-offset  在当前行

用GDB调试多进程程序

在子进程中sleep,然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去.如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止.那么

使用GDB调试多进程

如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去. 如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理--终止进程. 那么该如何调试子进程呢?有3种方法: 1.follow-fork-mode 在2.5.60版Linux内核及以后,GDB对使

GDB调试多进程程序

[gdb manaul]https://sourceware.org/gdb/current/onlinedocs/gdb/Forks.html#Forks [参考]http://www.cnblogs.com/zhenjing/archive/2011/06/01/gdb_fork.html [参考]http://blog.chinaunix.net/uid-23062171-id-4107159.html gdb没有对fork创建的进程调试做特别的支持.如果用gdb调试父进程,父进程创建子进

GDB调试——启动调试程序

一.启动 >>gdb启动 gdb 调试之前加载调试符号,即编译时候加 –g选项,如 gcc file.c –g –o target 启用gdb的方法种有3种,一种是启动core,还有是attach一个已经运行的进程. 1. gdb <program> 2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件. 3. gdb <program> <PID> 如果你

linux下的C语言开发(gdb调试)

原文: http://blog.csdn.net/feixiaoxing/article/details/7199643 用gdb调试多进程的程序会遇到困难,gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,但可以设置gdb在fork之后跟踪父进程还是子进程.以上面的程序为 #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define MAXLINE 80 int main(voi

【手册】GDB调试指令

1.列出源程序 (gdb) l(list) <line> //列出(line-5)行到(line-1+5)行间的内容 (gdb) l(list) <line1,line2> //列出(line1)行到(line2)行间的内容 2.运行程序 (gdb) r(run) <arg1,arg2,...,argn> //若"不列出参数",则使用"上次输入参数" (gdb) show args //查看当前使用"参数" (