多进程调试

我们使用gdb调试程序,gdb的调试默认是调试父进程的,如果要做到对父进程和子进程都做到调试,所以附加了调试子进程的功能。

  1. 设置条件

    如果让gdb可以同时调试多个程序,只需要设置follow-fork-mode(默认:parent)和detach-on-fork(默认:on)就好了。

follow-fork-mode detach-on-fork 操作

parent 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]

  1. 启动方法

  2. gbd program

  3. gdb program core

同时调试一个运行程序和core文件

  1. gdb program pid

如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程。

  1. 查询进程

    查询正在调试的进程:info inferiors

    切换调试的进程:inferior

    添加新的调试进程:add-inferior [-copies n] [-exec executable].
  2. 常见命令

    命令 功能

    I 从第一行开始列出源码

    break func 在函数func的入口处设置断点

    break n 在第n行处设置断点

    info break 查看断点信息

    r 运行程序

    n 单步执行

    c 继续运行

    p 打印变量值

    bt 查看函数堆栈

    finish 退出函数

    shell 命令行 执行shell命令行

    set args 指定运行时参数

    show args 查看设置好的参数

    show paths 查看程序运行路径

    clear n 清除第n行断点

    delete n 删除第n个断点

    disable n 暂停第n个断点

    enable n 开启第n个断点

    step 单步调试如果有函数调用,则进入函数

    list 简记为l,列出程序源代码,默认每次显示十行

    list 行号 将显示当前文件以行号为中心的前后10行代码

    list 函数名 将显示函数名所在函数的源代码

    run 简记为r,运行程序,当遇到断点时,程序会在断点处停止运行。

    回车 重复上一条命令

    print a 将显示整数a的值

    print name 将显示字符串name的值

    watch 表达式 设置一个监视点一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。

    kill 强制终止当前调试程序

    help help命令将显示常用帮助信息

    call 函数 调试函数

    layout 用于分割窗口,可以一边查看代码,一边测试

    quit 简记为q,退出gdb

    set environment varname [=value] 设置环境变量。如:set env USER=hchen;

    show environment [varname] 查看环境变量;
  3. 调试多进程

    以下面程序为例进行调试:

include <stdio.h>

2 #include <unistd.h>

3 #include <stdlib.h>

4

5 void son_fun()

6 {

7

8 pid_t pid=getpid();

9 printf("son:%d\n",pid);

10 }

11 void father_fun()

12 {

13 pid_t pid=getpid();

14 printf("father:%d\n",pid);

15 }

16 int main()

17 {

18 pid_t id=fork();

19 if(id<0)

20 {

21 perror("fork");

22 exit (1);

else if(id==0)

25 {

26 son_fun();

27 }

28 else

29 {

30 father_fun();

31 }

32 return 0;

33 }

其他重要命令

add-inferior [-copies n] [-exec executable]

添加新的调试进程,可以用file executable来分配给inferior可执行文件。增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。

remove-inferiors infno

删除一个infno号的inferior。如果inferior正在运行,则不能删除,所以删除前需要先kill或者detach这个inferior。

clone-inferior [-copies n] [infno]

复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior。如果不指定infno,则就复制正在调试的inferior。

detach inferior infno

detach去掉编号是infno的inferior。注意这个inferior还存在,可以再次用run命令执行它。

kill inferior infno

kill掉infno号inferior。注意这个inferior仍然存在,可以再次用run等命令执行它

多线程调试

gbd默认支持调试多线程,跟踪主线程,子线程断点在create thread。

  1. 常见命令

    info thread: 查看当前进程的线程

    thread ID :切换调试的线程为指定ID的线程。

    break file.c:100 thread all : 在file文件第100行处为所有经过第100行的线程设置断点。

set scheduler-locking off |on|step

在使用step或continue命令调试当前被调试线程的时候,其他线程也同时执行。

如果只让被调试程序执行,我们需要以下命令。

命令 含义

off 不锁定任何线程,也就是所有线程都执行,默认值。

on 只有当前被调试程序执行

step 在单步的时候,出来next过一个函数的情况(设置断点然后continue的行为)。

2. 调试程序

以下面程序为例进行调试:

void* thread1(void* arg)

{

printf("thread1, tid is %lu\n", pthread_self());

return NULL;

}

void* thread2(void* arg)

{

printf("thread2, tid is %lu\n", pthread_self());

return NULL;

}

int main()

{

pthread_t tid1, tid2;

pthread_create(&tid1, NULL, thread1, NULL);

pthread_create(&tid2, NULL, thread2, NULL);

pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;

}

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

  1. GDB 调试多线程多进程

    GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的.这里总结一下多进程和多线程的调试方法和技巧. 多进程的调试: 如下示例 #include <sys/mman.h> # ...

  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. [树形DP]加分二叉树

    加 分 二 叉 树 加分二叉树 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j ...

  2. 理解的shell父子关系

    今天我们谈谈linux系统的shell的父子关系,因为大家对手机都比较熟悉,手机本身也是一个linux主机,所以我们今天就拿手机来举个例子. 首先就是创建一个新的shell,你可以把它理解成一个手机打 ...

  3. Spring (二)SpringIoC和DI注解开发

    1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...

  4. python正则表达式基本语法

    一.最常用的匹配语法 re.match 从头开始匹配 re.search 匹配包含 re.findall 把所有匹配到的字符放到以列表中的元素返回 re.split  以匹配到的字符当做列表分隔符 r ...

  5. 请解释Spring事务传播传播行为

    什么叫事务传播行为? 听起来挺高端的,其实很简单. 即然是传播,那么至少有两个东西,才可以发生传播.单体不不存在传播这个行为. 事务传播行为(propagation behavior)指的就是当一个事 ...

  6. hdu 1867 求两个串的"和"最小 ,KMP

    题意:       给你两个字符串,让你求str1+str2,就是把1的后面和2的前面重叠的地方只显示一遍就行了 abc + bcd = abcd,要求和的长度最小,和最小的前提下求字典序最小,还有就 ...

  7. PAT 乙级 -- 1009 -- 说反话

    题目简述 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出.       输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是 ...

  8. POJ1324贪吃蛇(状态压缩广搜)

    题意:       给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...

  9. 后渗透阶段之基于MSF的内网主机探测

    当我们通过代理可以进入某内网,需要对内网主机的服务进行探测.我们就可以使用MSF里面的内网主机探测模块了. 在这之前,先修改 /etc/proxychains.conf ,加入我们的代理. 然后 pr ...

  10. node-redis基本操作

    //npm install redis var redis = require("redis"), client = redis.createClient(); client.se ...