gdb调试多进程与多线程

来源:互联网 发布:gp328写频软件 编辑:程序博客网 时间:2024/06/08 11:11

break 行号:设置断点

clean 行号:清除断点

info break:显示断点

finish:退出函数

bt:查看函数堆栈

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

delete breakpoint 删除所有的断点

disable/enable breakpoint 1 使能断点

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

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

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

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

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

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

这种方法通过测试也可以调试任意种线程,比如好几个fork,个人感觉比第二种方法好用

每次想要调试子进程或者是父进程的时候,首先通过set follow-fork-mode 设置父子

在父子的进程中设置一个端点,不要在fork的时候用n,那样会直接执行到底,设置一个端点,然后c继续执行

执行到这个进程中,如果这个进程中含有fork,需要重新设置想要调试的父子进程,设置端点,c执行




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

通过attach 进程号 

通过这个进行调试的时候,一般要在进程的开始位置设置让其休眠一段时间方便attach,这个运行的时候需要root权限。进程号的获取可以通过 pstree -ap | grep 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.内部调试



0 0