首页 > 解决方案 > Gdb 挂起断点无法解析

问题描述

我的系统是 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

现在,当我尝试像这样在 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 位处理器而缺少某种功能。我怎样才能解决这个问题?

标签: cdebuggingassemblygccgdb

解决方案


当我在 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

推荐阅读