2011-04-17 82 views
45

我已經從x86 Linux機器上的死進程(如果它很重要,內核2.6.35-22)有一個全堆核心轉儲,我試圖在GDB中進行調試。GDB:列出崩潰進程的所有映射內存區域

是否有一個GDB命令我可以使用它的意思是「顯示一個由該進程分配的所有內存地址區域的列表?」換句話說,我能弄清楚在這個轉儲中我可以檢查的所有可能的有效內存地址是什麼?

的原因,我想問的是,我需要跨越整個進程堆來搜索特定的二進制字符串,並以使用find命令,我需要有一個開始和結束地址。簡單地從0x00搜索到0xff的..不起作用,因爲find儘快停止,因爲它遇到一個地址不能訪問:

(GDB)找到/ W 0x10000000處,0xff000000, 0x12345678的

警告:無法訪問0x105ef883的目標內存,暫停 搜索。

因此,我需要獲得內存中所有可讀地址區域的列表,以便我可以一次搜索一個。

(我之所以要做是我需要找到在內存中,在某個地址指向所有的結構。)

無的show memshow procinfo meminfo proc似乎做我需要的。

回答

64

在GDB 7.2:

(gdb) help info proc 
Show /proc process information about any running process. 
Specify any process id, or use the program being debugged by default. 
Specify any of the following keywords for detailed info: 
    mappings -- list of mapped memory regions. 
    stat  -- list a bunch of random process info. 
    status -- list a different bunch of random process info. 
    all  -- list all available /proc info. 

你想info proc mappings,除了當沒有/proc(如POS驗調試期間),這是行不通的。

嘗試maintenance info sections

+0

這是我嘗試的第一件事情之一,但它似乎是空的(標題行下沒有任何東西)。也許這對核心轉儲不起作用? – Crashworks 2011-04-17 04:52:13

+1

賓果,謝謝! – Crashworks 2011-04-17 05:22:17

+12

'維修信息部分'似乎更便攜,應該是這裏的主要答案。 – phihag 2012-02-23 11:56:45

5

我剛纔看到以下內容:

set mem inaccessible-by-default [on|off] 

here

它可能讓你如果內存訪問搜索不考慮。

15

如果您有程序和核心文件,則可以執行以下步驟。

1)核心文件

$gdb ./test core 

2)型信息的文件,看看有什麼不同的細分是有核心文件一起運行的程序gdb的。

(gdb)info files 

甲輸出樣本:

(gdb)info files 

    Symbols from "/home/emntech/debugging/test". 
    Local core dump file: 
`/home/emntech/debugging/core', file type elf32-i386. 
    0x0055f000 - 0x0055f000 is load1 
    0x0057b000 - 0x0057c000 is load2 
    0x0057c000 - 0x0057d000 is load3 
    0x00746000 - 0x00747000 is load4 
    0x00c86000 - 0x00c86000 is load5 
    0x00de0000 - 0x00de0000 is load6 
    0x00de1000 - 0x00de3000 is load7 
    0x00de3000 - 0x00de4000 is load8 
    0x00de4000 - 0x00de7000 is load9 
    0x08048000 - 0x08048000 is load10 
    0x08049000 - 0x0804a000 is load11 
    0x0804a000 - 0x0804b000 is load12 
    0xb77b9000 - 0xb77ba000 is load13 
    0xb77cc000 - 0xb77ce000 is load14 
    0xbf91d000 - 0xbf93f000 is load15 

在我的情況我有15個段。每個段都有地址的開始和地址的結束。選擇要搜索數據的任何細分。例如,讓我們選擇load11並搜索一個模式。 Load11的起始地址爲0x08049000,結束於0x804a000。

3)在段中搜索模式。

(gdb) find /w 0x08049000 0x0804a000 0x8048034 
0x804903c 
0x8049040 
2 patterns found 

如果您沒有可執行文件,則需要使用打印核心文件所有段的數據的程序。然後你可以在一個地址搜索特定的數據。我沒有找到任何程序,您可以在下面的鏈接中使用該程序打印核心或可執行文件的所有段的數據。

http://emntech.com/programs/printseg.c 
+2

有沒有辦法讓gdb在沒有手動指定每個段的情況下搜索所有這些段? – evolvedmicrobe 2014-08-17 14:31:05

4
(gdb) maintenance info sections 
Exec file: 
    `/path/to/app.out', file type elf32-littlearm. 
    0x0000->0x0360 at 0x00008000: .intvecs ALLOC LOAD READONLY DATA HAS_CONTENTS 

這是從評論由上述phihag,需要單獨的答案。這可以工作,但info proc不在gcc-arm-none-eabi Ubuntu軟件包的arm-none-eabi-gdb v7.4.1.20130913-cvs上。

4

您還可以使用info files列出加載在進程二進制文件中的所有二進制文件的所有部分。

+1

與OP無關,但此評論對我有幫助,因爲我仍在學習gdb,而這正是我所期待的。謝謝,abhi! – spoorlezer 2015-08-25 20:42:34

0

maintenance info sections的問題是該命令嘗試從二進制文件的節頭中提取信息。如果二進制文件被觸發(例如sstrip),或者當加載程序在加載後可能改變內存許可時(例如RELRO的情況),它會給出錯誤的信息,則它不起作用。

+0

調試核心轉儲時,'info proc mappings'不可用。 – Crashworks 2017-04-06 18:58:48

+0

呵呵,你說得對,'info proc mappings'不適用於這種情況。 – 2017-04-07 07:21:34