為什麼 GDB 需要執行檔以及核心轉儲?
我正在使用核心轉儲進行調試,並註意 gdb 需要您提供執行檔以及核心轉儲。為什麼是這樣?如果核心轉儲包含程序使用的所有記憶體,那麼執行檔不包含在核心轉儲中嗎?也許不能保證整個 exe 都載入到記憶體中(儘管單個執行檔通常不是那麼大),或者核心轉儲畢竟不包含所有相關記憶體?是符號(也許它們沒有正常載入到記憶體中)嗎?
核心轉儲只是程序記憶體佔用的轉儲,如果您知道所有內容在哪裡,那麼您可以使用它。
您使用執行檔是因為它解釋了事物在記憶體中的位置(就邏輯地址而言),即核心文件。
如果您使用命令
objdump
,它將轉儲有關您正在調查的可執行對象的元數據。以名為 a.out 的可執行對象為例。
objdump -h a.out
僅轉儲標題資訊,您將看到名為例如的部分。.data或*.bss或.text*(還有更多)。這些通知核心載入器在對像中可以找到各個部分的位置以及應該在程序地址空間中的何處載入該部分,以及對於某些部分(例如 .data .text)應該載入什麼。(.bss 部分不包含文件中的任何數據,但它指的是在程序中為未初始化數據保留的記憶體量,它用零填充)。可執行目標文件的佈局符合標準 ELF。
objdump -x a.out
- 傾倒一切如果可執行對象仍然包含它的符號表(它沒有被剝離 -
man strip
並且您曾經-g
生成調試生成以gcc
假設 ac 原始碼編譯),那麼您可以通過符號名稱檢查核心內容,例如,如果您有一個變數/緩衝區在您的原始碼中命名為inputLine,您可以使用該名稱gdb
來查看其內容。即gdb
會知道從您的程序初始化數據段開始的偏移量,其中inputLine開始和該變數的長度。進一步閱讀第 1條、 第 2條,以及詳細的執行檔和連結格式 (ELF) 規範。
在下面的@mirabilos 評論後更新。
但是如果使用符號表,如
$ gdb --batch -s a.out -c core -q -ex "x buf1"
生產
0x601060 <buf1>: 0x72617453
然後不使用符號表並直接檢查地址,
$ gdb --batch -c core -q -ex "x 0x601060"
生產
0x601060: 0x72617453
我已經直接檢查了記憶體,而沒有使用第二個命令中的符號表。
我還看到,@ user580082 的回答進一步增加了解釋,並將投票。