2011-12-08 18 views
5

上報告的backtrace中的問號我試圖用ARM上的gdbserver調試軟件以獲得崩潰的回溯。不幸的是,我只得到問號。到處都是,我讀到這個問題只是與缺少符號有關,但符號不會從我的庫中去除。只有gdb在ARM

如果我嘗試使用file命令加載符號在客戶端,我得到:

reading symbols from <path>/libQtWebKit.so.4.7.2...(no debugging symbols found)...done. 

然後,當發生崩潰:

Program received signal SIGSEGV, Segmentation fault. 
0x00000000 in ??() 
(gdb) bt 
#0 0x00000000 in ??() 
#1 0x4bf38b88 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

我的庫在發佈編譯但符號實際上在那裏。用nm我可以找到那些。爲什麼我只能得到問號?這是否僅僅是因爲這些庫是通過優化編譯的?是不是可以在發佈模式下使用庫進行調試?

回答

2

corrupt stack說明可能是您的問題。它看起來像是一個返回地址或虛擬表條目,或者某些東西被零覆蓋,然後控制權被轉移到那裏。即使您有符號可用,這些地址也不會指向有效的符號。因此段錯誤。

我不羨慕你的任務。這些是一些最難追蹤的錯誤,甚至可以移動或暫時消失,當您更改代碼以嘗試捕獲它們時。你最好的選擇通常是git bisect或你的VCS相當於找到引入它的提交。希望它不難複製。

+1

不幸的是,這是對WebKit的修改。沒有以前的版本可以恢復。任何其他方式來調試?也許valgrind? –

1

當你得到「地址爲0的SEGV」問題時,有時候可以使用的一個技巧是手動從棧頂彈出返回地址到PC並試圖從那裏做一個堆棧跟蹤。這假定你需要通過NULL指針進行間接調用,這是獲取地址0的最常見方式。0

現在我不太熟悉ARM,但在x86 PC上,你會這樣做:

(gdb) set $eip = *(void **)$esp 
(gdb) set $esp = $esp + 4 

然後做另一次回溯找出你真正的位置。

如果你可以找出你的編譯器用於ARM的調用約定,你應該可以做類似的事情。