2012-05-28 4 views
8

У меня есть адрес в памяти, и я хочу узнать разрешения (r/w/x) этого адреса памяти.GDB проверяет разрешения памяти

E.g.

char *s = "hello"; 

Здесь строковый литерал «привет» хранится в постоянной памяти. При запуске программы через gdb есть возможность проверить разрешения для этого адреса памяти (разрешено ли только чтение или т. Д.)?

+1

Вы можете использовать 'info proc mappings' в GDB, но он не дает вам разрешений. Вы можете посмотреть '/ proc/PID/maps', где' PID' является pid вашего процесса - это даст вам карты с их разрешениями. –

ответ

10

Вы можете сначала найти, где s указывает на:

(gdb) print s 
$6 = 0x400dbc "foo" 

и найдите раздел, в котором он в:

(gdb) maintenance info sections 
Exec file: 
    `/home/mfukar/tmp', file type elf64-x86-64. 
    ...sections... 
    0x00400db8->0x00400dfb at 0x00000db8: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS 
    ...more sections... 

и искать READONLY флаг.

Кроме того, обратите внимание на /proc/PID/maps, где PID - это pid процесса, от которого вы отлаживаетесь, и можете получить с помощью info proc.

+0

Я использую LLDB, для которого эквивалентная команда - это секции изображений, – DarenW