2010-01-28 23 views
4

嗨,我最近在用C編寫的linux項目中。 這個應用程序有幾個進程,它們共享一個共享內存塊...當應用程序運行幾次小時,一個進程崩潰沒有任何足跡,因此很難不知道問題是什麼或在哪裏我可以開始審查代碼....好吧,它可能是內存溢出或指針marused ...但我不知道。 .. 你有任何工具或任何方法來檢測問題... 它將非常感激,如果它得到解決。 thanx爲您的建議...如何檢測我的應用程序在Linux中崩潰的位置

回答

4

之前啓動該程序,使核心轉儲:

ulimit -c unlimited 

(並確保過程的工作目錄是進程可寫)

的進程崩潰後,就應該留下一個core文件,然後你可以gdb檢查:

gdb /some/bin/executable core 

此外,還可以根據運行過程當你啓動它時 - gdb會在進程崩潰時喚醒。

1

Valgrind是你需要下一步去的地方。機會是你有一個良性的記憶錯誤問題 - 直到它不是。運行valgrind下的程序,看看它說什麼。

3

如果您正在運行emacs,您也可以在gdb-many-windows中運行gdb。這給你更好的調試選項,可以讓你檢查堆棧等東西。這很像Visual Studio IDE。

這裏是一個有用的鏈接

http://emacs-fu.blogspot.com/2009/02/fancy-debugging-with-gdb.html 
0

我同意bmargulies - Valgrind是絕對目前最好的工具來自動檢測不正確的內存使用情況。幾乎所有的Linux發行版都應該擁有它,所以只需emerge valgrindapt-get install valgrind或任何發行版使用。然而,Valgrind並不是存在的最神祕的東西,它通常只能幫助你判斷程序最終是以什麼方式錯誤地訪問內存 - 如果你在一個變量中存儲了一個不正確的數組索引,然後在之後訪問這個數組,那麼你仍然必須弄清楚。特別是在與GDB這​​樣強大的調試器配對時(然而,backtracebt命令是你的朋友),Valgrind是一個非常有用的工具。

只要記住用-g標誌進行編譯(如果您至少使用GCC),或者Valgrind和GDB將無法告訴您在源中發生內存濫用的位置。