2014-10-29 60 views
2

我基本上跟在core dump note section之後。我沒有發佈這個問題,但我試圖做同樣的事情:編寫一個程序來從頭開始創建核心轉儲文件;除了我正在嘗試爲嵌入式ARM處理器上運行的自定義單線程固件。爲基於ARM的嵌入式系統創建coredump

我還提到谷歌coredumper來源,以瞭解如何通常創建核心文件。到目前爲止,我已成功創建了一個核心文件,其中包含由GDB讀取的PT_NOTE和PT_LOAD程序頭文件。

請注意,我正在嘗試爲自定義固件創建此核心文件,但這不是Linux環境。我的問題是關於PT_LOAD程序頭。根據我的理解,我只需要創建與活動線程(需要創建內核)一樣多的PT_LOAD程序頭,並使用表示每個線程內存映射的頭文件。由於我的固件是單線程的,我只創建了一個PT_LOAD程序頭,其中存儲器映射是堆棧上的地址值。

當我用這個新創建的核心文件加載固件的ELF圖像時,GDB用「info reg」精確打印寄存器。 GDB還可識別PC(程序計數器)值並精確顯示符號。但是,它不能顯示堆棧中剩餘的幀(「bt」不起作用)。它抱怨說「無法訪問地址(SP + 4)處的內存」。

我已經在覈心文件中提供了固件的堆棧映射,並且GDB應該能夠在地址(SP + 4)處進行讀取。請注意,我可以使用「x 0x(SP + 4)」檢查(SP + 4)處的值。

誰能告訴我我在這裏錯過了什麼?

感謝

回答

1

我想通了這一點。顯然,PT_LOAD程序頭文件的內容 - 堆棧映射不完整。問題是它需要正在運行的一個線程的整個映射。包含整個CPU SRAM的內容後,GDB「bt」和其他所有命令都可以正常工作。

另外,根據我的理解,可執行文件具有所有變量的地址,核心文件具有這些變量的運行時值。因此,如果任何符號是駐留的內存(RAM),則應添加一個帶有RAM映射的獨立PT_LOAD程序頭。之後,GDB應該能夠準確地打印這些變量的運行時值。如果沒有映射,變量的值將爲0(如GDB所示)。