c - 调试子进程不适用于 set detach-on-fork off

标签 c linux debugging gdb fork

我有下面的简单程序。

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

#define CHILD 0

int main()
{
    pid_t pid;
    printf(" My pid = %d \n", getpid());
    getchar();
    pid = fork();
    if( pid == CHILD){
        printf(" child: My pid = %d \n", getpid());
        while(1);
    }
    else{
        printf(" My pid = %d \n", getpid());
        printf(" Newly created child pid = %d \n", pid);
        while(1);
    }
}

我正在尝试用 gdb 调试它。我想同时调试父进程和子进程。我使用了以下命令

Reading symbols from ./1...done.
(gdb) b 12
Breakpoint 1 at 0x73f: file 1.c, line 12.
(gdb) set detach-on-fork off
(gdb) r
Starting program: ./1 
 My pid = 121710 


Breakpoint 1, main () at 1.c:12
12      pid = fork();
(gdb) n
[New process 121715]
Reading symbols from ./1...done.
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x73f

(gdb) info inferior
  Num  Description       Executable        
* 1    process 121710    ./1 
  2    process 121715    ./1 
(gdb) bt
#0  0x00007ffff7ac8b1c in __libc_fork () at ../sysdeps/nptl/fork.c:135
#1  0x0000555555554744 in main () at 1.c:12
(gdb) n
[New process 121715]
Reading symbols from ./1...done.
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x73f
Cannot insert breakpoint 1.
Cannot access memory at address 0x73f

你们能帮我解决我在上面的 gdb 命令中犯的错误吗?

最佳答案

我在使用 gdb 8.1 调试 fork() 时遇到了同样的问题,调试选项相同。

一种解决方案是在调用 fork() 之前删除所有断点。比如你在fork()的前一个源码行创建了一个断点,用于单步执行fork(),当前inferior停在这个断点后应该删除所有的断点,然后当前inferior可以继续运行成功,不会有错误提示比如不能插入断点……

关于c - 调试子进程不适用于 set detach-on-fork off,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57023979/

相关文章:

c - void 语句的问题

mysql - 从mysql执行系统命令

python - 如何将不同的图片正确插入到单个文件中

javascript - 在浏览器开发者工具中发现 JavaScript 执行路径和文件

java - 如何在 Mac OS X for Android 中找到 ~/.android/debug.keystore?

c - 在 C 中的字符串中的定义位置获取字符

c - 如何在运行时向我的嵌入式应用程序添加多语言选择?

c++ - 在 C++ 项目中使用 C 代码

php - 是否可以用 PHP 编写 WHM 插件?

java - 如何编辑/加载 Eclipse 插件