【问题标题】:Gdb pending breakpoint does not resolve [duplicate]Gdb挂起断点无法解析[重复]
【发布时间】:2021-01-09 02:53:18
【问题描述】:

我的系统是 Debian 64 位

我用c写了一个简单的hello world程序

2       #include <string.h>
3
4       int main() {
5               char str_a[20];
6
7               strcpy(str_a, "Hello, world!\n");
8               printf(str_a);
9       }

编译它 gcc -g -o char_array2 char_array2.c 并通过gdb -q ./char_array2输入gdb

现在当我尝试像这样在 strcpy 设置断点时

(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) 

尝试运行,断点未解析,打印出“Hello world”,程序终止。

按下运行后应该发生什么

Breakpoint 4, 0xb7f076f4 in strcpy () from /lib/tls/i686/cmov/libc.so.6

现在我在一本教授 32 位系统上的汇编的书中读到了这篇文章,并且路径显示 /i686/,所以我怀疑由于我使用 64 位处理器而缺少某种功能。我该如何解决这个问题?

【问题讨论】:

  • 可能没有实际调用strcpy。相反,编译器只是内联了初始化数组所需的程序集。
  • 即使禁用了优化,GCC 仍然将 strcpy 视为内置函数,并将该副本从文字复制到 mov-immediate,因为 arg 是同一语句的常量部分. godbolt.org/z/GvP8vn。如果你想让 GCC 变笨,请使用 -fno-builtin 编译。
  • What exactly is -fno-builtin doing here? 与您的问题完全相同,具有相同的来源和相同的问题,包括相同的 GDB 错误消息,但它们仍在为 32 位模式编译。也许你运气不好,你使用的搜索词没有出现。

标签: c debugging assembly gcc gdb


【解决方案1】:

当我在 x686 上使用你的编译选项编译你的代码时,我得到了这个:

    leaq    -32(%rbp), %rax
    movabsq $8583909746840200520, %rdx
    movq    %rdx, (%rax)
    movl    $1684828783, 8(%rax)
    movw    $2593, 12(%rax)
    movb    $0, 14(%rax)

注意,strcpy 没有电话。编译器已内联逻辑。使用-fno-builtin,我明白了:

    leaq    -32(%rbp), %rax
    leaq    .LC0(%rip), %rsi
    movq    %rax, %rdi
    call    strcpy@PLT
    .loc 1 8 16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2014-09-22
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多