我使用GDB来调试我的代码,并在函数中创建断点时陷入困境(例如:使用string.h中的strcpy)。
1)在此代码中,gdb在strcpy函数内的断点处停止。
(gdb) list
1 #include<stdio.h>
2 #include<string.h>
3 main()
4 {
5 char a[20],b[]="ffff";
6 strcpy(a,b);
7 printf("%s\n",a);
8 }
(gdb) break 6
Breakpoint 1 at 0x8048486: file thu.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x8048370
(gdb) break 7
Breakpoint 3 at 0x804849a: file thu.c, line 7.
(gdb) run
Starting program: /home/m/a.out
Breakpoint 1, main () at thu.c:6
6 strcpy(a,b);
(gdb) c
Continuing.
Breakpoint 2, 0xb7ea2490 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) c
Continuing.
Breakpoint 3, main () at thu.c:7
7 printf("%s\n",a);
你可以看到gdb在breakpoint2(strcpy内)停止。
2)在此代码中,GDB不会在断点2(strcpy内部)停止,而是转到breakpoint3。
(gdb) list
1 #include<stdio.h>
2 #include<string.h>
3 main()
4 {
5 char a[20];
6 strcpy(a,"hello world!");
7 printf("%s\n",a);
8 }
(gdb) break 6
Breakpoint 1 at 0x8048449: file thu.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 7
Breakpoint 3 at 0x8048469: file thu.c, line 7.
(gdb) run
Starting program: /home/m/a.out
Breakpoint 1, main () at thu.c:6
6 strcpy(a,"hello world!");
(gdb) c
Continuing.
Breakpoint 3, main () at thu.c:7
7 printf("%s\n",a);
那么是什么让两个案例不同? 我遵循了这本书&#34;黑客:剥削的艺术&#34; Jon Erickson,这是本书的一个例子,案例2与第39页的代码char_array2.c类似,但是在断点2的情况下输出与本书不相似。
感谢阅读!
答案 0 :(得分:1)
在第一种情况下,编译器具有所有细节(所有参数都是堆栈上已知偏移量的变量。因此编译器可能用宏替换了对strcpy的调用。在第二种情况下,并非所有关于参数是已知的,因此编译器插入了对strcpy的实际调用