2016-06-17 8 views
3

Я отлаживаю разделенную программу, используя gdb.загрузить фальшивый отладочный символ в gdb при отладке разделенной программы

(gdb) bt 
#0 0x00007fffcb443650 in fooSnprintf() from ./install.so.1 

Я знаю, что третий аргумент является формат жало:

(gdb) print (char*)$rdx 
$9 = 0x7fffe8dd4050 "%u %s" 

Как мне сделать GDB показать функцию арг в точке прерывания остановки, как это делает, когда реальные символы отладки загружается?

Breakpoint 1, fooSnprintf (a=0, b=0, fmt=0x40060a "%u %s") at test.c:3 

Я знаю о hook-stop, но это глобальное и вызовет любую точку останова.

Это работает, но неудобно:

define hook-stop 
    if $rip == fooSnprintf 
     print (char*)$rdx 
    end 
end 
+0

Является ли программа, которую вы попытаетесь отладить свою собственную программу или программа третьей стороны? Нет ли способа получить незасеянную версию программы? Или ядро? Если у вас есть дамп ядра, вы можете скопировать его и отладить программу локально, используя незанятый исполняемый файл. –

+0

@JoachimPileborg Я бы не спросил, могу ли я сделать это – basin

ответ

1

можно ассоциировать команды с определенной точки останова с помощью commands директиву:

break fooSnprintf 
commands 
print (char*)$rdx 
end 

См here подробнее

1

Сделано поддельный источник файл.

[[email protected] ~]# cat fooSnprintf.c 
void padding() { 
__asm__ volatile (
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
"\n nop" 
); 
} 

int fooSnprintf(void *a, void *b, char *fmt, ...) { 
     return a && b && fmt; 
} 

Составитель разделяемую библиотеку с -O2 (важно, потому что с -O0 GDB ожидает, что функция положить регистры в стек). Метод проб и ошибок выбран правильный адрес загрузки:

[[email protected] ~]# gcc -fPIC -g -O2 -shared -o fooSnprintf.so fooSnprintf.c \ 
-Wl,-Ttext-segment=$(printf 0x%x $((0x00007fffcb443650 - 1392))) 

Load

(gdb) symbol-file /root/fooSnprintf.so 
Load new symbol table from "/root/fooSnprintf.so"? (y or n) y 
Reading symbols from /root/fooSnprintf.so...done. 
(gdb) c 
Continuing. 

Breakpoint 2, fooSnprintf (a=0x7fffc9ef0560, b=0xc8, fmt=0x7fffe8dd4050 "%u %s") at fooSnprintf.c:21 
21    return a && b && fmt; 

 Смежные вопросы

  • Нет связанных вопросов^_^