2011-02-19 144 views
21

我有一個非常複雜的shell腳本,它在其中調用我想通過GDB進行調試的C++程序。將這個C++程序與shell分離是非常困難的,因爲它有很多分支和大量的環境變量設置。使用GDB調試從shell腳本調用的C++程序

有沒有辦法在這個shell腳本上調用GDB?看起來像gdb需要我直接調用一個C++程序。

+0

媽......同樣的問題依然存在。我想我們需要做一個簡單的['set follow-fork-mode child'](https://stackoverflow.com/q/15126925/608639)來獲得我們感興趣的代碼... – jww

回答

13

有兩個選項,你可以做:

  1. 調用GDB直接在shell腳本。這意味着你沒有標準輸入和標準輸出重定向。

  2. 運行shell腳本,然後將調試器附加到已運行的C++進程中,如下所示:gdb progname 1234其中1234是正在運行的C++進程的進程ID。

如果您在程序開始運行之前需要做某些事情,那麼選項1將是更好的選擇,否則選項2是更乾淨的方式。

1

您能暫時將gdb添加到腳本中嗎?

3

我可能會修改腳本來始終調用gdb(稍後恢復)或添加一個選項來調用gdb。這幾乎總是最簡單的解決方案。

接下來最簡單的方法就是臨時移動可執行文件,並將其替換爲在移動的程序上運行gdb的shell腳本。例如,在包含您的程序的目錄中:

$ mv program _program 
$ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program 
$ chmod +x program 
2

修改C++應用程序以打印其pid並休眠30秒(可能基於環境或參數)。使用gdb附加到正在運行的實例。

8

除了通過@ diverscuba23提到的選項,你可以做到以下幾點:

gdb --args bash <script> 

(假設它是一個bash腳本,否則相應的調整。)