2012-03-16 179 views
0

當我查看Linux內核的OOPS輸出時,EIP和其他代碼地址的值在0xC01 -----範圍內。在我的System.map和objdump -S vmlinux輸出中,所有的代碼地址至少在0xC1以上。我的vmlinux包含調試符號(CONFIG_DEBUG_INFO)。Linux內核文本符號

當我通過串行連接(kgdb)進行調試時,我用gdb ./vmlinux加載gdb時,我又遇到了同樣的問題,我無法使用System.map和objdump輸出中的$ eip協調$ eip。當我運行在gdb where,我得到的堆棧上的混亂的爛攤子:

#0 0xC01----- in ??() 
#1 0xC01----- in ??() 
#2 0xC01----- in ??() 
... 

任何人都可以就如何解決這一/這些問題有什麼建議?我主要關心的是,我如何實際將OOPS中的eip值映射到System.map或objdump -S vmlinux。我知道OOPS會給我函數名和目標代碼的偏移量,但我更關心前面提到的問題,以及爲什麼gdb無法正確顯示堆棧回溯。

回答

0

看起來像OOPS是因爲你跳進了一個不是功能的地方。
這很容易導致崩潰,並且還會阻止調試器將地址解析爲符號。

您可以通過拆解此EIP周圍的區域來檢查。如果我是正確的,那麼作爲機器代碼就沒有意義了。

這種情況通常有兩個原因:
1.使用損壞的函數指針進行函數調用。在這種情況下,最後的堆棧幀應顯示調用者。但是你沒有這個框架,所以它可能是另一個原因。 2.堆棧溢出 - 您的返回地址已損壞,所以您已返回到不正確的位置。如果是這樣,ESP指向的數據應包含EIP中的地址。調試堆棧超限很困難,因爲缺少最重要的信息來源。您可以嘗試以「raw」格式(x/xa addr)打印堆棧,並嘗試理解它。