使用 GDB 在 strcpy 上断点

问题描述 投票:0回答:1

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

  1. 在这段代码中,gdb 在 strcpy 函数内的断点处停止。

    (gdb)列表 1 #包括 2 #包括 3 主要() 4 { 5 个字符 a[20],b[]="ffff"; 6 strcpy(a,b); 7 printf("%s “,A); 8} (gdb) 中断 6 断点 1 位于 0x8048486:文件 thu.c,第 6 行。 (gdb) 中断 strcpy 断点 2 位于 0x8048370 (gdb) 中断 7 断点 3 位于 0x804849a:文件 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 “,a);

您可以看到 gdb 在断点 2 处停止(在 strcpy 内)。

  1. 在此代码中,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 与第 39 页的代码 char_array2.c 类似,但输出与书中的情况不相似断点2.

c debugging gdb
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.