2009-06-27 38 views
2

我試圖實現一個函數來回溯內核中崩潰的用戶空間進程。因爲,我在Kernel工作,我沒有任何庫的豪華,並提供回溯功能不支持MIPS架構。我只是想知道我是否可以模擬GDB做什麼。 內核的版本是2.6.21。在MIPS Linux中追溯時,GDB如何找到函數的符號?

+0

你的意思是2.6.21?另外,爲什麼不做一個核心轉儲? – bdonlan 2009-06-27 03:22:07

+0

你是對的。將6.2.21更改爲2.6.21 – Quincy 2009-06-27 04:43:57

+0

此時將生成核心轉儲。我在這裏實施的是一個增強。 「如果你願意,可以增強調試體驗」。 – Quincy 2009-06-27 05:10:23

回答

1

我想你可以參考oprofile的實現。 (「 - fno-omit-frame-pointer」選項)Oprofile使用幀指針獲取後臺跟蹤信息,因此它需要用戶空間應用程序及其相關庫全部使用幀指針啓用。

另一種方式是,如果用戶的應用程序中包含調試信息來源,你可能需要檢查用戶應用程序的DWARF信息來源,DWARF調用框架信息來源proides了有關如何調用的函數足夠的信息來源調試器,以便它可以找到每個找到該函數的參數,找到當前的呼叫幀,並找到呼叫信息的呼叫幀。

如果你想簡單地抓取沒有支持「frame-pointer」的後臺跟蹤信息或任何調試信息,那麼你必須檢查用戶應用程序的mips指令,通過兒童上下文(SP,IP,RP)通過mips ABI規範獲得父上下文(SP,IP,RP),由於需要反編譯內存中的許多指令,這有點複雜且耗時,但它並不壞。例如,對於許多程序,在乞討中有一個「添加sp,sp,-32」類似指令,並且您將知道父項的sp是當前sp加32.

第二和第三種方式你必須自己實現它,因爲你在內核工作。

1

核心文件在ELF format。這是一個標準,在很多網站上只有一個谷歌可用。

然而,這種文件格式是非trival。很多怪癖和點點滴滴。任何合理的人應該使用第三方庫。如果你真的想這樣做,從libelf和readelf開始。祝你自己好運。