GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的。这里总结一下多进程和多线程的调试方法和技巧。

多进程的调试:

如下示例

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
static int glob = ; void test()
{
int i = ;
printf("child pid: %d\n", getpid());
while()
{
i++;
sleep();
     printf("child running\n");
}
} int main()
{
int pid = fork();
if(pid == )
{
test();
}
else if(pid > ){
printf("father pid : %d\n", getpid());
int n = ;
while()
{
n++;
sleep();
       printf("father running\n");
}
}
wait(pid);
return ;
}

编译 gcc -g process.c -o process   -g一定要加上,否则没有调试信息。

1. 如果我想要锁定子进程/父进程该怎样?

这里在fork之后就会产生子进程, 如果我们要锁定子进程或者父进程可以使用  set follow-fork-mode [parent|child] 来完成。

(gdb) set follow-fork-mode child
(gdb) b
Note: breakpoint also set at pc 0x4006e4.
Breakpoint at 0x4006e4: file process.c, line .
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x00000000004006e4 in main
at process.c: inf ,
breakpoint already hit time
breakpoint keep y 0x00000000004006e4 in main
at process.c: inf ,
(gdb) delete breakpoints
(gdb) r
Starting program: /home/cps/桌面/IPC/process Breakpoint , main () at process.c:
int pid = fork();
(gdb) n
[New process ]
father pid :
[Switching to process ]
if(pid == )
(gdb) sparent running test();
(gdb) parent running

这里可以看到父进程一直在running, 跟踪子进程并没有停止父进程。 如果想要让父进程处于等待状态可以设置 set detach-on-fork [on | off]

(gdb) set follow-fork-mode child
(gdb) b
Breakpoint at 0x4006e4: file process.c, line .
(gdb) set detach-on-fork off
(gdb) r
Starting program: /home/cps/桌面/IPC/process Breakpoint , main () at process.c:
int pid = fork();
Missing separate debuginfos, use: debuginfo-install glibc-2.17-.el7.x86_64
(gdb) n
[New process ]
child pid:
child running
child running
child running
child running

可以看到父进程并没有执行,而是暂停状态。 只有子进程处于运行状态。

2. 如何跟踪一个正在运行的进程?

这里就要说到attach一个进程, 可以使用gdb -p pid execfilepath 来跟踪一个进程。

[cps@cps IPC]$ gdb -p  process
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.-.el7
Missing separate debuginfos, use: debuginfo-install glibc-2.17-.el7.x86_64
(gdb) bt
# 0x00007fb8d8fad650 in __nanosleep_nocancel () from /lib64/libc.so.
# 0x00007fb8d8fad504 in sleep () from /lib64/libc.so.
# 0x00000000004006d0 in test () at process.c:
# 0x00000000004006fc in main () at process.c:
(gdb) print i
No symbol "i" in current context.
(gdb) frame
# 0x00000000004006d0 in test () at process.c:
sleep();
(gdb) print i
$ =
(gdb)

这里的第一个print i 并没有打印东西,原因是没有进入堆栈, 我们进入test的堆栈后就可以查看变量。同时在gdb中也可以attach到一个进程中attach pid。

3. 进程异常crash 怎样查看?

这种情况下要打开coredump, 使用命令ulimit -c 1024 设置coredump开启。最后将dump文件和可执行文件 一同加载到gdb。 gdb coredump execfile。 进入gdb后 执行bt 和where 查看出错的地方。但是一般情况下的段错误用这种方法可很难查到。一般做法就是一步一步的调试,这种情况一般都是非法访问内存造成的,在最有可能出错的地方打断点。这种情况并没有较为直接的方法。

多线程调试:

1. 查看当前进程中的所有线程

info threads  查看当前进程下的所有线程。前面有*代表当前处于的线程。

thread id  可以切换当前处于的线程,bt查看线程的堆栈

2. 锁定一个线程

当我们在调试程序时, 若是想要调试某个线程,程序在执行过程中容易在线程之间来回切换, 我们可以选择一个线程后可以锁定它。

thread id 选定这个线程

set scheduler-locking on 可以用来锁定这个线程 只观察这个线程的运行情况。 当锁定这个线程时, 其他线程就处于了暂停状态。

3. 锁定一个线程,让其他线程照常执行

锁定一个线程让其他线程照常运行,这种用法在gdb 7.0以上的版本是支持的。可以如下设置gdb

set target-async
set pagination off
set non-stop on

这里的几个命令要在程序运行之前运行这些。

多进程和多线程的调试技巧还有很多, 这里只是说了一些常见的基本用法。 至于其他的一些gdb用法可以查看gdb help。

GDB 调试多线程多进程的更多相关文章

  1. gdb调试多线程多进程

    多进程调试 我们使用gdb调试程序,gdb的调试默认是调试父进程的,如果要做到对父进程和子进程都做到调试,所以附加了调试子进程的功能. 设置条件 如果让gdb可以同时调试多个程序,只需要设置follo ...

  2. 使用gdb调试多线程程序总结

    转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...

  3. Debugging with GDB 用GDB调试多线程程序

    Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为 ...

  4. 【疑难杂症】gdb调试多线程程序报错:interrupted system call

    一. cmake生成可调试版本的程序,该内容参考自https://www.linuxidc.com/Linux/2014-03/98622.htm 具体内容如下: 1, 使用CMAKE编译确实很方便. ...

  5. gdb 调试多线程 神贴

    gdb 调试多线程如果目标进程已经core dump了,那么 gdb -c core xxx   xxx是对应的程序文件.如果目标进程还在运行,通常此时用于调试线程死锁的情况.有两种方法一是 gdb ...

  6. GDB调试多线程

    先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. th ...

  7. gdb调试多线程程序总结

    阿里核心系统团队博客 http://csrd.aliapp.com/?tag=pstack Linux下多线程查看工具(pstree.ps.pstack) http://www.cnblogs.com ...

  8. 使用GDB调试产生多进程的程序

    如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...

  9. gdb 调试多线程

    基本i threads 等操作略过,只谈线程同步.异步控制: 先点到,gdb attach到主线程t1 时,所有线程都会停止,所谓同步异步效果,是指在apply continue到所有线程之后, 再切 ...

随机推荐

  1. jlink烧写Nor Flash时出错正确解决方法汇总:PC of target system has unexpected value after programming

    成都国嵌的课程:国嵌体验入门班-2-1(开发板系统安装-Jlink方式).rar毒害了不少人,那种直接烧写nor flash,不进行任何配置的方法,能够成功纯属偶然,他自己在视频中烧写时也出现了两次错 ...

  2. Flex中的FusionCharts 3D柱形图

    1.3D柱形图源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:f ...

  3. VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动

      本文主要介绍了pcPentium BSP中包含的驱动程序.包含了官方提供的所有驱动程序,除了aic7888Lib--现在已用得很少的一个AIC-7888 SCSI控制器的驱动介绍.建议重点阅读at ...

  4. Linux中挂载Windows共享出来的目录

    Windows中1.新建文件夹,创建共享目录 右键文件夹,共享 2.设置访问方式 Everyone,添加确认 Linux-ubuntu中1.安装cifs#sudo apt-get install ci ...

  5. 通过smtp直接发送邮件

    /// <param name="fromEmail">发件人的邮箱</param> /// <param name="toEmail&qu ...

  6. 【编程笔记】Unity3D语言的类型系统--C#的类型系统

    几乎所有的编程语言都有自己的类型系统. 而编程语言更是常常按照其类型系统而被分为强类型语言/弱类型语言.安全类型语言/不安全类型语言.静态类型语言/动态类型语言等. 而C#的类型系统是静态.安全,并且 ...

  7. 【BZOJ3994】约数个数和(莫比乌斯反演)

    [BZOJ3994]约数个数和(莫比乌斯反演) 题面 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] 多组数据\((<=50000组)\) \(n,m<=50000\ ...

  8. Marriage Match IV HDU - 3416

    题意 给你n个点,m条边,要求每条边只能走一次的S到T的最短路径的个数 题解 在我又WA又TLE还RE时,yyb大佬告诉我说要跑两遍SPFA,还说我写的一遍SPFA是错的,然而 啪啪打脸... 而且他 ...

  9. 宿主机无法访问linux虚机中的网站

    问题现象: Nginx服务已启动 80端口被nginx监听 宿主和linux虚机可相互ping通 Linux虚机可用curl访问网站 宿主无法用浏览器访问网站 排查: 1.  查看nginx的acce ...

  10. Java中常见数据结构Map之HashMap

    之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/ ...