2015-04-03 67 views
1

我使用GDB来调试我的代码,并在函数中产生断点时卡住(例如:使用string.h中的strcpy)。使用GDB的断点

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内部),而是到断点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); 

那么是什么让两种情况不同呢? 我跟着书“黑客:开发的艺术”Jon Erickson,这是本书的一个例子,案例2与代码char_array2.c在39页相似,但输出与案例中的书不相似的断点2.

感谢您的阅读!

回答

1

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