2011-04-20 76 views
5

我有一個應用程序,在C++上運行的Linux,在出口獲取中止信號。 在追蹤代碼來追究問題之前,我需要知道可能會發生什麼情況,以便從內核中獲取中止信號。這可以給我正確的調試方向。中止信號的一般原因是什麼?

請提及應用程序可能會收到中止信號的每種潛在情況。

@執行情形的細節是,

  • 過程是在退出模式,即出口()例程被調用過程的正常關機。
  • 因此調用所有全局對象析構函數。

TIA

+1

你一定要明白,在gdb運行你的應用程序將讓你看到確切的所在行中止被調用,並給你一個調用堆棧 – radman 2011-04-20 04:59:41

+0

我有幾次與gdb運行,​​但問題是,一旦進程中止信號它是從gdb分離。所以堆棧跟蹤不可用。 – Mandar 2011-04-20 06:56:14

回答

3
  • 與調試器-g
  • 運行它編譯

當應用程序崩潰時,調試器會給你行,讓你檢查線,變量...

其他解決方案:

  • 改變你的核心轉儲代與ulimit
  • 負載核心轉儲在gdb驗屍

根本原因可能是多方面的:通過閱讀0的內存空間,劃分之外,取消引用無效指針...

+0

我試過,但無法獲得堆棧跟蹤。這個過程在中止時,si簡單地從gdb中分離出來。 – Mandar 2011-04-20 05:29:32

0

我會嘗試在valgrind下運行。甚至在中止和valgrind可以注意到並告訴你之前,可能會有內存錯誤。如果是這樣的話,你會發現這個錯誤比使用像gdb這樣的傳統調試器容易得多。

0

對於中止的原因是一般斷言失敗

例如

(gdb) bt 
#0 0x00000035fbc30265 in raise() from /lib64/libc.so.6 
#1 0x00000035fbc31d10 in abort() from /lib64/libc.so.6 
#2 0x00000035fbc296e6 in __assert_fail() from /lib64/libc.so.6 
相關問題