如前文所述,gdb 遇到 fork 指令时默认会 attach 到父进程去,因此上述输出中有一行提示 ”Detaching after fork from child process 7509“,我们按 Ctrl + C 将程序中断下来,然后输入 bt 命令查看当前调用堆栈,输出的堆栈信息和我们在方法一中看到的父进程的调用堆栈一样,说明 gdb 在程序 fork 之后确实 attach ...
gdb (gdb)attach xxxxx--- xxxxx为利用ps命令获得的子进程process id (gdb)stop--- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch (gdb)break37-- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码 Breakpoint 1 at 0x10808: file eg1.c, line 37. (gdb)c...
当attach到进程后,在该段代码之后设上断点,再把该文件删除就OK了。当然你也可以采用其他的条件或形式,只要这个条件可以设置/检测即可。 Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。 GDB wrapper 很多时候,父进程 f...
My program spawns a child thread with execvp to run another program in xterm: char *argv[] = {"xterm", "-e", "./anotherProgram", 0 }; execvp("xterm", argv); I know anotherProgram is running but in gdb, "info thread" doesn't show it. How can I attach the child thread and ...
Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。 2,follow-fork-mode/detach-on-fork 在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试 ...
int wib(int no1, int no2){ int result, diff;diff = no1 - no2;result = no1 / diff;return result;} int main(){ pid_t pid;pid = fork();if (pid <0) { printf("fork err\n");exit(-1);} else if (pid == 0) { /* in child process */ sleep(60)...
pid=5744,说明gdb当前挂载在父进程上,“set follow-fork-mode child”开启子进程调试 (gdb) set follow-fork-mode child (gdb) r Breakpoint 1, main () at example2.c:19 19 pid_t pid = fork(); (gdb) n [Attaching after process 5746 fork to child process 5747] [New inferior 2 (process ...
Attach是调试进程的常用办法,只要有可执行程序以及相应PID,即可工作。当然,为方便调试,可以在进程启动后,设定sleep一段时间,如30s,这样即可有充足的时间来attach。 方法2: set follow-fork-mode child + main断点 当设置set follow-fork-mode child,gdb将在fork之后直接执行子进程,知道碰到断点后停止。如何设置子进...
#include<sys/types.h>#include<unistd.h>#include<stdio.h>voidfunc(intpid,intret){printf("My PID is %d, fork() returned %d\n",pid,ret);if(ret)printf("We are in the parent process\n");elseprintf("We are in the child process\n");}intmain(){intr=fork();func(getpid(),r);retur...
用gdb 先调试父进程,等子进程fork出来后,使用gdb attach到子进程上去。当然,您需要重新开启一个 Shell 窗口用于调试,gdb attach的用法在前面已经介绍过了。 我们这里以调试 nginx 服务为例。 从nginx 官网 http://nginx.org/en/download.html 下载最新的 nginx 源码,然后编译安装(笔者写作此文时,nginx 最新稳定...