我很難找出這一個;我有一個程序,iverilog
執行system()
調用調用另一個程序,ivl
。我想在gdb中調試第二個程序ivl
,但是當我用父進程調用gdb時,我無法讓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破壞?
你是對的,'system()'調用調用了多個程序,我感興趣的並不是第一個,所以gdb會跟着第一個下一個,當它完成時停止。當我通過'劣等2'完成時,我能夠通過切換到另一個劣勢來解決這個問題。謝謝! – mtveezy