2010-09-30 49 views
1

我正在編寫一個程序,對我的同事編寫的代碼運行一些單元測試。我正在使用Google C++ testing framework。我運行一個產生3個線程的函數,然後運行30秒。運行後,程序以狀態0退出。這顯然不是預期的行爲。我知道它並沒有讓它變得更遠,因爲我在下一個直接行中寫了一個cout語句。C++程序意外退出,我該如何使用gdb進行調試?

我的問題是,什麼是最好的方式去調試這與gdb?這很難,因爲程序沒有段錯或者類似的東西,它只是退出。有沒有辦法掛鉤退出電話,然後得到一個很長的回溯?

謝謝你的幫助。

編輯:

cSystemCfg* pSystemCfg = new cSystemCfg(); 
std::cout << "Before runThing" << std::endl; 
pSomething->runThing(&acq, pHwIf, pSystemCfg, pIf); 
//Exits here, never gets to the next line 
std::cout << "After runThing" << std::endl; 
+0

您確定退出代碼0是錯誤嗎? – 2010-09-30 13:19:48

+0

你可以發佈你的代碼嗎?幫助會更容易。 – 2010-09-30 13:19:55

+0

爲什麼exacty不能以0退出?你的意思是程序不會退出它的主要0?在這種情況下,exit(0)被稱爲某處..在那裏放一個斷點,我會說。 – stijn 2010-09-30 13:20:11

回答

3

除了break exit,還有一些其他地方可能需要設置斷點。看看this question and answers

+0

感謝您的鏈接;它幫助了很多。事實證明,我的程序正在執行所有的事情,只是在該函數調用之後,沒有任何內容正在打印到屏幕上。 – xxpor 2010-09-30 14:17:08

2

在gdb簡單break exit命令應該停止程序,並允許你把程序從任何線程調用exit當檢查狀態。

這當然假設程序從調用exit結束,而不是由於某些其他原因,如abort,斷言失敗,未處理的異常或從主返​​回。

+0

應該做到這一點。否則,查看調用exit()等並在那裏放置斷點,但我想這是gdb的中斷退出的整點,不是嗎? – stijn 2010-09-30 13:38:22

+0

我只是試過這個,它仍然允許線程退出。我嘗試了反向步驟,它說:「目標多線程不支持此命令。」 – xxpor 2010-09-30 13:38:45

+0

如果你在說'break exit'時沒有在'exit'中斷開,那麼'exit'不是導致你的程序退出的原因。試着打斷'abort'或'catch throw'來停止拋出的異常,或者調查你的程序是否正在接收一個導致它終止的信號。 – 2010-09-30 13:48:20