C 使用GDB的断点

C 使用GDB的断点,c,debugging,gdb,C,Debugging,Gdb,我使用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

我使用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)列表
1#包括
2#包括
3主要内容()
4   {
5字符a[20],b[]=“ffff”;
6份strcpy(a、b);
7 printf(“%s\n”,a);
8   }
(gdb)中断6
0x8048486处的断点1:文件thu.c,第6行。
(gdb)断开strcpy
0x8048370处的断点2
(gdb)突破7
0x804849a处的断点3:文件thu.c,第7行。
(gdb)运行
启动程序:/home/m/a.out
断点1,main()位于thu.c:6
6份strcpy(a、b);
(gdb)c
持续的。
断点2,0xb7ea2490英寸??()来自/lib/i386 linux gnu/libc.so.6
(gdb)c
持续的。
断点3,main()位于thu.c:7
7 printf(“%s\n”,a);
您可以看到gdb在断点2处停止(在strcpy内部)

2) 在这段代码中,GDB不会在断点2(strcpy内部)停止,而是转到断点3

(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);
(gdb)列表
1#包括
2#包括
3主要内容()
4   {
5个字符a[20];
6个strcpy(一个“你好,世界!”);
7 printf(“%s\n”,a);
8   }
(gdb)中断6
0x8048449处的断点1:文件thu.c,第6行。
(gdb)断开strcpy
未定义函数“strcpy”。
是否在将来加载共享库时使断点挂起?(y或[n])y
断点2(strcpy)挂起。
(gdb)突破7
断点3位于0x8048469:文件thu.c,第7行。
(gdb)运行
启动程序:/home/m/a.out
断点1,main()位于thu.c:6
6个strcpy(一个“你好,世界!”);
(gdb)c
持续的。
断点3,main()位于thu.c:7
7 printf(“%s\n”,a);
那么,是什么让这两个案例有所不同呢?。 我正在学习Jon Erickson的书“黑客攻击:利用的艺术”,这是书中的一个例子,案例2与第39页的代码char_array2.c相似,但在断点2的情况下,输出与书中的不同


谢谢你的阅读

在第一种情况下,编译器拥有所有细节(所有参数都是堆栈上已知偏移量的变量。因此,编译器可能用宏替换了对strcpy的调用。在第二种情况下,并非所有关于参数的细节都是已知的,因此编译器插入了对strcpy的实际调用