示例 1:段错误(Segmentation Fault)
假设你有以下简单的C程序,它会因为尝试解引用一个空指针而导致段错误:
#include <stdio.h>
int main() {int *ptr = NULL;printf("%d\n", *ptr); // 尝试解引用空指针
return 0;
}
编译并运行这个程序会导致段错误,并生成core dump文件。使用GDB来调试这个core dump文件,你可能会看到以下信息:
gdb ./a.out core
在GDB中:
(gdb) bt#0 0x0000555555554662 in main () at segfault_example.c:5(gdb) info registers rax 0x0 0rbx 0x0 0rcx 0x7ffff7e5d0b0 140737351862448rdx 0x0 0...(gdb) list 1 #include <stdio.h> 2 3 int main() { 4 int *ptr = NULL; 5 printf("%d\n", *ptr); // 尝试解引用空指针 6 return 0; 7 } (gdb) x/i $rip=> 0x555555554662 <main+18>: mov (%rax),%eax
在这个示例中:
-
bt
显示了栈跟踪,指向了崩溃发生的函数和位置。 -
info registers
显示了寄存器的状态,其中rax
寄存器(通常用于存储内存地址)的值为0,这表明了尝试读取地址0的内容。 -
list
显示了源代码,指出了崩溃发生的具体行。 -
x/i $rip
显示了导致崩溃的指令,这里是尝试从地址0读取整数。