我在C中创建了这个简单的程序用于调试目的:
#include <stdio.h>
#include <string.h>
int main() {
char str_a[20];
strcpy(str_a, "Hello, world!\n");
printf(str_a);
}
当使用GDB调试程序时,我在第6行(空行),第7行(strcpy函数)和第8行(print)设置断点。所以这就是我所做的:
(gdb) break 6
Breakpoint 1 at 0x4004ee: file char_array.c, line 6.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) break 8
Breakpoint 3 at 0x400510: file char_array.c, line 8.
就我而言,到目前为止一切顺利。但是现在我运行程序时会出现问题:
(gdb) run
Starting program: /root/Documents/Scripts/C Scripts/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) i r rip
rip 0x4004ee 0x4004ee <main+8>
这表明RIP寄存器仍然是主要的。继续:
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
显然,该程序跳过第二个断点(在strcpy),但为什么?我看不出任何理由。为了确保程序跳过断点,我再次查看了RIP寄存器:
(gdb) i r rip
rip 0x400510 0x400510 <main+42>
因此RIP寄存器没有跳转到共享库,仍然在main()中。这是什么原因?!很多时候它一直让我感到不安。