C Gdb挂起断点未解析

C Gdb挂起断点未解析,c,debugging,assembly,gcc,gdb,C,Debugging,Assembly,Gcc,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 } 试着运行它,断点没有被解析,“H

我的系统是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       }
试着运行它,断点没有被解析,“Hello world”被打印出来,程序终止

按run键后,应该发生什么

断点4,strcpy()中的0xb7f076f4来自/lib/tls/i686/cmov/libc.so.6


现在我在一本书中读到了这一点,这本书介绍了32位系统上的汇编,并且路径显示为/i686/,因此我怀疑由于我使用64位处理器而缺少某种功能。如何修复此问题?

当我在x686上使用编译选项编译代码时,我得到以下信息:

    leaq    -32(%rbp), %rax
    movabsq $8583909746840200520, %rdx
    movq    %rdx, (%rax)
    movl    $1684828783, 8(%rax)
    movw    $2593, 12(%rax)
    movb    $0, 14(%rax)
    leaq    -32(%rbp), %rax
    leaq    .LC0(%rip), %rsi
    movq    %rax, %rdi
    call    strcpy@PLT
    .loc 1 8 16
注意,没有调用strcpy。编译器已将逻辑内联。使用
-fno内置的
,我得到了以下结果:

    leaq    -32(%rbp), %rax
    movabsq $8583909746840200520, %rdx
    movq    %rdx, (%rax)
    movl    $1684828783, 8(%rax)
    movw    $2593, 12(%rax)
    movb    $0, 14(%rax)
    leaq    -32(%rbp), %rax
    leaq    .LC0(%rip), %rsi
    movq    %rax, %rdi
    call    strcpy@PLT
    .loc 1 8 16

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