c++ - 进入子进程时gdb中断

标签 c++ c debugging gdb

我很难弄清楚这个问题;我有一个程序 iverilog 执行 system() 调用以调用另一个程序 ivl。我想在 gdb 中调试第二个程序 ivl,但是当我用父进程调用 gdb 时,我无法让 gdb 在子进程中设置任何断点。程序如下所示:

//iverilog-main.cpp (Parent process)

int main(){
    //...
    system("ivl arg1 arg2");
    //...
    return 0;
}

.

//ivl-main.cpp (child process)

int main(){
    //...
    //stuff I want to debug
    //...
    return 0;
}

.

我正在运行的 gdb 命令是:gdb iverilog -x cmds.gdb

# cmds.gdb
set args hello.v
set follow-fork-mode child
set breakpoint pending on
break ivl-main.cpp:main
run

不幸的是,gdb 并没有在 ivl-main.cpp:main 处中断,它只是在没有中断的情况下完成;我得到的输出是:

Starting program: /usr/local/bin/iverilog hello.v
[New process 18117]
process 18117 is executing new program: /bin/dash
[Inferior 2 (process 18117) exited normally]

我确定正在调用 ivl-main.cpp:main,因为当我在 gdb 中运行 ivl 程序时,它会在那里成功中断。

我的想法是 gdb 在运行 gdb iverilog 时不会将 ivl-main.cpp 识别为源文件,并且在进入包含 ivl 的子进程时不会设置该断点-main.cpp 作为源文件。所以我认为如果我在 gdb 进入子进程时为 ivl-main.cpp 设置断点,它应该可以工作。我能想到的唯一方法是在 system() 调用处手动中断并进入子进程,然后设置断点。是否有更优雅的方法可以在进入子进程时强制 gdb 中断?

最佳答案

通常 GDB 一次只调试一个进程 - 如果您的程序 fork ,那么您将调试父进程或子进程,但不会同时调试两者。默认情况下,GDB 在 fork 之后继续调试父级,但如果您愿意,可以使用以下命令更改此行为:

设置follow-fork-mode child

或者,您可以告诉 GDB 将父项和子项都置于其控制之下。默认情况下,GDB 只跟踪一个进程,但您可以使用以下命令告诉它跟踪所有子进程:

关闭 fork 分离

GDB 将每个被调试的进程称为“劣等”进程。调试多个进程时,您可以使用“inferiors”命令检查每个进程并与之交互,类似于使用“threads”检查多个线程或与之交互的方式。

在此处查看更多文档:

https://sourceware.org/gdb/onlinedocs/gdb/Forks.html

关于c++ - 进入子进程时gdb中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882101/

相关文章:

c++ - 如何使 C++ 类以 const 方式访问所有另一个类的私有(private)成员(只读不写)

c++ - Opengl 游戏循环多线程

C scanf - 未知数组大小

python - 优化 Django

multithreading - 逆向多线程错误

iphone - 在 iOS 上跟踪崩溃

c++ - 有没有一种简洁的方法可以将文本输出到调试 Pane ?

C++ Win32 (WinAPI) 带有最大化按钮的自定义窗口框架

c - 旧 C 代码无法编译

c - 设置管道缓冲区大小