Поскольку вы используете 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.