【发布时间】:2017-05-10 01:13:51
【问题描述】:
我很难弄清楚这一点;我有一个程序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 在进入子进程时中断?
【问题讨论】: