2012-06-13 45 views
1

我的多線程程序崩潰。我有.core文件。我加載它,thread apply all backtrace並得到下面的輸出線程墜毀:gdb - 獲取真實的崩潰行

Thread 1 (Thread 0x8567800 (runnable)): 
#0 GG::serialize (this=0x847c180, [email protected]) 
    at basic_string.h:269 

好,崩潰,序列化,但報告說,它發生在STL basic_string.h:269

但是如何獲得實際碰撞線serialize()函數?

+0

向上調用堆棧適用於我。然而,在調試方面,我有點新手。 – chris

+0

@chris你在做什麼?或者查看'thread apply all backtrace'報告的整個信息。我在我的例子中跳過了一些行,因爲在'serialize()'之前,下一行報告了前一個函數。但是我想知道'serialize()'的代碼或者其他的東西是怎麼回事。我在這個函數中序列化了'3'' std :: string',但不明白爲什麼它崩潰的時間... – abrahab

+1

嗯,我使用CodeBlocks,所以它很容易。通常它可能會像'我的功能>一些低級別的功能>一些低級別的>崩潰',我所要做的就是滾動到我看到我的功能的地方,然後突出顯示/進入崩潰的行* *代碼。這有時候是你需要弄清楚爲什麼它崩潰的所有信息。沒有這樣的事情,我不確定。 – chris

回答

1

如果崩潰是可重現的,最簡單的方法是重新編譯內聯禁用的錯誤代碼(在g++中,這是-fno-inline-fno-default-inline)。

如果您必須分析您擁有的核心,請嘗試查找string中正在調用的方法,並在您的serialize函數中找到相應的調用。

有時候,除了反彙編你的函數以外,沒有別的方法可以找到問題,並且通過一些步驟來找出彙編代碼的哪些部分與源代碼相對應。然後,要計算局部變量的值,必須執行info registers,並跟蹤將哪些值移入了哪個寄存器。

+0

是的,它很難,但是我可以重現它。我在彙編器:( – abrahab