инструкция по сборке для оскорбительного оператора C - PullRequest
0 голосов
/ 07 ноября 2011

Здравствуйте,

   0x08048981 <+1165>:  call   0x8048404 <printf@plt>
   0x08048986 <+1170>:  jmp    0x8048a52 <main+1374>
   0x0804898b <+1175>:  mov    -0x38(%ebp),%eax
   0x0804898e <+1178>:  mov    -0x24(%ebp),%edx
   0x08048991 <+1181>:  mov    (%eax,%edx,4),%eax
   0x08048994 <+1184>:  sub    $0x4,%eax
=> 0x08048997 <+1187>:  mov    (%eax),%ebx

Как я могу получить соответствующий оператор C для инструкции по сборке. Инструкция на адрес 0x08048997 является местоположением segfault, как показано в gdb, и я получил вышеупомянутую сборку с командой disassemble в gdb.

Спасибо, Капил

1 Ответ

3 голосов
/ 07 ноября 2011

Поскольку вы используете gdb, я предполагаю, что вы используете gcc для компиляции.Добавьте флаг -g при компиляции, а затем загрузите свой исполняемый файл в gdb.Я собираюсь использовать эту маленькую программу в качестве примера:

#include <stdio.h>

int main(void)
{
   char *str = "hello";

   *str = 'a'; /* Will cause a segfault, trying to modify read-only memory */

   return 0;
}

т.е.gcc -g -o test test.c

Когда я запускаю программу в gdb, она вылетает и выдает следующий вывод:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400484 in main () at test.c:7
7      *str = 'a';

Как видите, поскольку отладочная информация была добавлена ​​в исполняемый файл, gdbскажет вам, где произошла ошибка, и покажет строку, в которой она произошла.Я также могу использовать list 7 или list *0x400484 для просмотра строк кода вокруг той, которая вызвала ошибку.

Вы также можете использовать disas, чтобы увидеть инструкцию по сборке, где произошла ошибка:

...
   0x0000000000400480 <+12>:    mov    rax,QWORD PTR [rbp-0x8]
=> 0x0000000000400484 <+16>:    mov    BYTE PTR [rax],0x61
   0x0000000000400487 <+19>:    mov    eax,0x0
...

Я думаю, что сделал этот пост длиннее, чем нужно ... Короче говоря, как я уже упоминал в начале, добавьте флаг -g, если вы используете gcc для повышения эффективности отладки с помощью gdb.

...