如何使用gdb调试多进程

作者&投稿:月罗 (若有异议请与网页底部的电邮联系)
Linux:如何使用gdb调试多进程多线程程序~

follow-fork-mode
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
follow-fork-mode的用法为:
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
因此如果需要调试子进程,在启动gdb后:
(gdb) set follow-fork-mode child
并在子进程代码设置断点。
此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。

  follow-fork-mode
  在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
  follow-fork-mode的用法为:
  set follow-fork-mode [parent|child]
  parent: fork之后继续调试父进程,子进程不受影响。
  child: fork之后调试子进程,父进程不受影响。
  因此如果需要调试子进程,在启动gdb后:
  (gdb) set follow-fork-mode child

  并在子进程代码设置断点。
  此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
  set detach-on-fork [on|off]
  on: 断开调试follow-fork-mode指定的进程。
  off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
  注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
  follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。

在大多数系统,gdb对使用fork创建的进程没有进行特别的支持。当父进程使用fork创建子进程,gdb仍然只会调试父进程,而子进程没有得到控制和调试。这个时候,如果你在子进程执行到的代码中设置了断点,那么当子进程执行到这个断点的时候,会产生一个SIGTRAP的信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理——终止进程。
当然,你可以使用时间延迟的方法,在子进程fork出来之后,使用Sleep函数等待一段时间再运行,在这段时间中你使用ps找到该进程,然后使用Attach方法把该进程附加到gdb中,从而达到可以调试子进程的目的。
在一部分系统中(我使用的是基于2.6内核的CentOS,支持follow-fork和detach-on-fork模式),比如HP-UX11.x之后的版本,Linux2.5.60之后的版本,可以使用以下的方法来达到方便的进行多进程调试功能。
默认情况下,父进程fork一个子进程,gdb只会继续调试父进程而不会管子进程的运行。
如果你想跟踪子进程进行调试,可以使用set follow-fork-mode mode来设置fork跟随模式。
set follow-fork-mode 所带的mode参数可以是以下的一种:
parent
gdb只跟踪父进程,不跟踪子进程,这是默认的模式。
child
gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。
进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。

可以看到目前使用的模式是parent。

然而,有的时候,我们想同时调试父进程和子进程,以上的方法就不能满足了。Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:
on
只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
off
父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定)
另一个进程会被设置为暂停状态。
同样,show detach-on-fork显示了目前是的detach-on-fork模式,如上图。

以上是调试fork产生子进程的情况,但是如果子进程使用exec系统函数而装载了新程序执行呢?——我们使用set follow-exec-mode mode提供的模式来跟踪这个exec装载的程序。mode可以是以下的一种:
new 当发生exec的时候,如果这个选项是new,则新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。
same 当发生exec的时候,如果这个选项是same(默认值),因为父进程已经退出,所以自动在执行exec的inferior上控制子进程。

我们可以使用apue里面第8章的例子代码来做测试:

#include "apue.h"

intglob = 6;/* external variable in initialized data */
charbuf[] = "a write to stdout\n";

int
main(void)
{
intvar;/* automatic variable on the stack */
pid_tpid;

var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");/* we don't flush stdout */

if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) {/* child */
glob++;/* modify variables */
var++;
} else {
sleep(2);/* parent */
}

printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}


gdb使用流程
本文详细介绍了如何使用gdb进行程序调试的流程,以下是步骤的概述:首先,编写一个简单的程序test.c,包含main函数和sum函数。在编辑器中编写并保存后,使用gcc编译器添加"-g"选项生成可执行文件test。进入gdb调试环境,启动gdb并载入可执行文件。gdb会显示版本信息和库文件等细节。在gdb命令行界面,通过"l...

gdb调试技术
单步调试允许用户细致地跟踪程序执行过程,查看每一步的执行情况,而查看源码则有助于理解代码的逻辑。多线程调试则为处理并发问题提供了便利,允许用户在多线程环境中进行细致的调试。如果你需要更深入地了解这些命令的用法,可以参考相关的gdb命令手册,以便在实际调试中得心应手。通过这些工具,gdb调试技术...

gdb\/cgdb常见调试命令详细总结
具体示例3.1 以运行中的进程为例,演示调试步骤3.2 动态数组和静态数组的内存查看3.3 搜索源代码、设置观察点和捕捉点功能3.4 强制调用函数和终止调试在进行调试时,务必记得在结束后使用detach和quit命令,以解除gdb对程序的影响。通过熟练运用这些命令,你可以有效地解决编程过程中的各种问题。

GDB 调试常用命令
在GDB调试过程中,启动程序的方式有多种,可以直接启动GDB并使用file命令加载可执行文件。在查看和操作程序时,GDB提供了一系列简洁的命令。例如,list或l用于查看源代码,i用于获取信息,b用于设置和管理断点,包括常规断点b、临时断点tb和运行时断点rb,以及与断点相关的操作如info和d。执行程序时,r代表...

linuxgdb调试教程linuxgdb调试
4、可动态改变用户程序的执行环境。gdb是什么意思?GDB是什么 GDB全称“GNUsymbolicdebugger”,从名称上不难看出,它诞生于GNU计划(同时诞生的还有GCC、Emacs等),是Linux下常用的程序调试器。发展至今,GDB已经迭代了诸多个版本,当下的GDB支持调试多种编程语言编写的程序,包括C、C++、Go、Objective-C...

使用GDB调试C程序
在软件开发的精密探索之旅中,GNU GDB调试器堪称不可或缺的盟友,它如同一个强大的调试工具箱,让你在程序的世界里游刃有余。通过简单的gdb -version指令,你可以确认你的GDB版本,同时它还支持诸如-s、-e和-t等多种命令行选项,让你的调试体验更加灵活。启动GDB的命令行格式通常是gdb [options] [...

C\/C++生态工具链——GDB调试器
GDB使用示例 进行可视化界面调试,使用命令"gdb .\/demo -tui"。GDB主要语法 包含查看运行信息、调试指令、进程和线程调试指令。GDB使用案例 多线程调试、分析程序核心转储。设置core文件、定位崩溃原因、查看堆栈信息。相关阅读 了解GDB更详细信息,参考以下链接:十鸥网linux gcc教程、GNU GDB官方文档、...

实战GDB 调试
GDB, 作为GNU软件系统中的标准且可移植的调试器,广泛应用于多种类UNIX操作系统,支持C、C++、Pascal和FORTRAN等多种编程语言的调试。实战GDB调试1. 启动和结束调试 - 启动调试二进制文件或进程,使用gdb命令,退出时用quit或q。 处理core文件,即进程崩溃时生成的包含重要信息的磁盘文件,可通过...

一文学会GDB调试
GDB是一款强大的调试工具,下面将简要介绍其基本操作和一些高级功能。首先,确保编译时使用-g参数以启用调试信息,这对于GDB的使用至关重要。查看和设置断点是调试的基础。通过`i b`或`b`命令查看已设置的断点,`l`用于在运行时查看源代码并检查变量值。为函数设置断点时,可以使用`break`或`b`加上...

GDB(pwndbg)调试命令
GDB(pwndbg)调试工具提供了丰富的命令选项,以帮助开发者深入理解和调试程序。首先,对于断点操作,设置和管理它们是调试的关键。内存相关的操作同样重要,通过命令“x\/nfu addr”,开发者可以精细地探索内存状态。这里的“n”参数用于指定输出单元的数量,"f"选项指定输出格式,而“u”则表示每个单元的...

秀洲区15829724637: 如何进行使用gdb?
成何丽扶: 3、使用gdb使用方法:在命令行中键入gdb并按回车就可以运行gdb了,启动gdb后,能在命令行上制定很多的选项,也可以下面的方式来运行gdb:gdbfilename用这种方式运行gdb时,能直接指定想要调试的程序

秀洲区15829724637: 如何gdb调试一个运行中的进程 -
成何丽扶: 第一步 编译一个死循环程序./* File name malloc.c*/#include <stdio.h> #include <stdlib.h> #include <string.h>void getmem(void **p, int num){*p = (void *)malloc(num); }void test(void){char *str = NULL;getmem((void **)&str, 100);strcpy(str, ...

秀洲区15829724637: 如何调试多线程的程序 -
成何丽扶: 可以使用gdb命令,调试多线程.在调试的过程中,可以输入命令:thread这是会列出多个线程的进程号.然后你可以选择进入哪个线程进行调试.只要输入:thread 线程进程号就可以了.同单线程调试的方法没有多大区别.请自己查看help命令.请一定要加分啊.

秀洲区15829724637: 如何用GDB进行调试
成何丽扶: 1: 对于在应用程序中加入参数进行调试的方法: 直接用 gdb app -p1 -p2 这样进行调试是不行的. 需要像以下这样使用: #gdb app (gdb) r -p1 -p2 或者在运行run命令前使用set args命令: (gdb) set args p1 p2 可以用show args 命令来查看 ...

秀洲区15829724637: 如何使用linux下gdb来调试python程序 -
成何丽扶: (1)假设要debug的进程号为1000,运行如下命令:$ gdb -p 1000 使用此命令即可使gdb附加到进程.(2)载入libpython脚本 如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本...

秀洲区15829724637: 如何用GDB调试Nginx -
成何丽扶: 下载源码, 解压后./configure --with-debug make make install Nginx提供了单进程模型和非守护进程的方式,由两个配置选项来控制:守护进程配置:daemon on | off ; Default: on多进程配置:master_process on | off ; Default: on 下来配置 ...

秀洲区15829724637: GDB怎么调试运行着的程序 -
成何丽扶: 1、ps -aux 命令 查找到 进程的PID 2、运行gdb 进入 后,执行attach pid . 运行着的程序就是这样,这个和windows上 windbg的attach功能是一样的.

秀洲区15829724637: 开发板上如何使用GDB -
成何丽扶: 调试时,应用程序在嵌入式目标系统上运行,而gdb调试在Host端. 一、编译安装gdb+gdbserver 首先下载gdb源码,我下载的是gdb-6.6.tar.gz.$tar xvzf gdb-6.6.tar.gz$mkdir mygdb$cd mygdb必须要在你想要安装的目录下执行下边的命令.$.....

秀洲区15829724637: 怎样用gdb调试mpi程序?
成何丽扶: Linux下MPI (Message Passage Interface) 的程序不太好调试,在windows下vs2005以上的IDE有集成的简便MPI调试工具,没有用过,有兴趣的可以试验一下.下面总结了...

秀洲区15829724637: gdb 调试 运行中进程
成何丽扶: 先ps出进程id,再gdb -a attach上去,b设一个断点,c继续运行就可以了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网