2016-09-30 51 views
0

我想在gdb中調試一個低級別的C程序。這個程序的目的是作爲一個包裝,啓動另一個進程,並監控/干擾其內存使用。程序僅在第一次運行時掛起?

當我在gdb中加載程序時,一切似乎都正常(如果不是理想的話)。我看到新的流程叉,然後它掛起。就其本身而言,這不會太奇怪;可能是我的代碼中的某個地方存在死鎖或無限循環。

但是,如果我中斷並殺死gdb內的進程,然後再次在同一個gdb會話中運行它,一切正常工作正常。大約需要半秒鐘的時間才能運行,並且完全按照它應該執行的操作。

所以我的問題是:什麼是GDB之間保持我的程序運行?第一次和第二次執行之間會有什麼變化?

+0

某些內存可能有一些不同的值。一些硬件狀態可能不同(你說它是低級的)。許多事情都可能發生。 –

+0

您可能正在訪問一些未初始化的變量,從而進入某種鎖。在第二次和後續運行中,正在運行的進程的數據段可能會重複使用,並且與以前一樣,但現在作爲初始值。注意「未初始化的變量」警告。 – tofro

+0

「但是當我中斷並殺死進程」 - *哪個進程?您正在調試的那個,還是分叉的(或兩者)?用實際的代碼 –

回答

0

我發現原因,但我仍然不明白爲什麼gdb會這樣做。但是我會在這裏發佈它,以防其他人使用它。

我發起了GDB:

GDB --args ./mywrapper testers_exe /測試儀2

當首次運行:

/家庭/ 用戶名/mywrapper testers_exe/tester-2

但是死亡,再次運行時,它模仿最近過程,沒有的觀點已獲得:

/家庭/ 用戶名/testers_exe /測試儀2 testers_exe /測試儀2

因此,它運行沒有包裝的測試,並避免包裝的無限循環。

相關問題