【发布时间】:2017-02-11 20:32:03
【问题描述】:
所以,我有以下 c 程序:
#include <stdio.h>
#include <string.h>
int main(){
char arr[20];
//this is line 6
strcpy(arr,"Hello, world!\n");
printf(arr);
}
我使用以下命令编译它:
gcc -g t2.c -o a2.out
之后我将它加载到 gdb 并尝试在第 6 行、strcpy 函数和第 8 行设置断点。果然,在 strcpy 设置断点时,我收到以下消息:“在未来共享库上设置断点挂起负载?(y 或 [n])”。我回答“y”并得到“Breakpoint 2 (strcpy) pending。”。
在回答“是”并运行程序后,断点 2 永远不会解决,调试器直接跳转到 printf 处的断点 3。
我在调试器中使用 Intel 语法。除此之外没有自定义设置。谁能说出为什么 strcpy 处的断点永远无法解决?
【问题讨论】:
-
最好的方法是在
main中断,然后在strcpy中断以确保加载C 库(将避免我永远无法工作的挂起断点功能)。跨度> -
我尝试在
main中插入一个中断,运行代码,并在到达第一个中断后在strcpy再次中断。它返回了这条消息Breakpoint 2 at gnu-indirect-function resolver at 0xb7e79f00。继续后,从未到达第二个断点。 -
如果你用
-fno-builtin-strcpy选项编译程序,它会在你的断点处停止吗? -
虽然设置了断点,但是到达断点时返回这个错误:
Breakpoint 2, __strcpy_sse2 () at ../sysdeps/i386/i686/multiarch/strcpy-sse2.S:1613 1613 ../sysdeps/i386/i686/multiarch/strcpy-sse2.S: No such file or directory. -
该错误仅表示您没有安装 glibc 的源代码。在这种情况下,它实际上已正确停止。
strcpy很特别,因为它是一个微优化的“间接”函数,这意味着在第一次调用时会选择特定的特定于架构的实现(或者可能是ld.so,我忘了)。我认为 gdb 在很好地调试间接函数方面仍然存在一些问题。
标签: c debugging gdb shared-libraries breakpoints