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.内部调试
- gdb调试多进程与多线程
- GDB调试-多进程与多线程程序
- gdb调试多进程与多线程
- gdb调试多进程与多线程
- gdb调试多进程与多线程
- 使用gdb调试多线程与多进程
- gdb调试多线程与多进程
- GDB调试多进程、多线程
- gdb多进程多线程调试
- gdb 多进程,多线程调试
- GDB多进程多线程调试
- gdb调试多线程多进程
- gdb调试多进程,多线程
- gdb调试多进程多线程
- gdb调试多进程多线程
- gdb调试多进程多线程
- gdb调试多进程、多线程
- gdb调试多进程多线程
- cmder命令行工具(配置,path不一致,admin管理员权限)
- HDU1520 & POJ 2342 Anniversary party(树形dp)
- c++ primer 学习笔记(2): 函数 function
- adb的基本运用
- Android与MVC
- gdb调试多进程与多线程
- 网络请求库的代码迁移
- FPGA视觉从入门到放弃——可变光照下结构化模板对边缘提取的影响
- Activity的生命周期
- C++ Primer 学习笔记_37_STL实践与分析(11)--set类型
- 设计模式之备忘录模式
- 平日小问题 (1): call of overloaded 'max(char&, char&)' is ambiguous
- 瀑布流
- uva315