2010-12-04 15 views
2
(gdb) s 
Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41 
41    if(thing->work(data)) { 
(gdb) s 
Program received signal SIGSEGV, Segmentation fault. 
0x00000000004040e1 in Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41 
41    if(thing->work(data)) { 

backtrace中,調用工作(數據)是最後一個;並且在GDB管理的流程輸入work(data)之前發生了分段(看起來像)。在list中,沒有任何工作聲明(數據),所以猜測執行的代碼多於回溯和最新步驟所顯示的代碼。gdb檢測到分段錯誤。如何查明確切的來源?

  1. 該段錯誤是否來自不良指針作爲函數參數以不良方式傳遞(沒有「extern C」或其他一些準備工作)? (假設沒有執行功能代碼)
  2. 如何獲得詳細的跟蹤以確定是否有任何work()代碼在進入函數後執行,或者錯誤發生在此刻,當進程試圖進入函數時,從而傳遞它libc的參數?
+4

`this` valid? `0x7fffffffdce0`對我來說似乎相當高。 – icecrime 2010-12-04 22:06:39

回答

1

正如我在評論說:我認爲,執行從未達到work(data)因爲this指針是無效的(0x7fffffffdce0看起來像垃圾)。 SIGSEGV在this->

對象是否在某個時間點被銷燬/刪除,並且您是否保留了引用或指針?

1

好,work()能尚未啓動,除非它是內聯,或者你會一直在回溯頂部...

我會嘗試拆解,看看有什麼指令觸發SIGSEGV和去那裏。