sizeof引用GDB中的数组

sizeof reference to array in gdb

本文关键字:数组 GDB 引用 sizeof      更新时间:2023-10-16
int main()
{
    typedef unsigned char a4[4];
    a4 p1;
    a4& p2 = p1;
    p2[1]=1;
    cout<<sizeof(p2);
    return p2[1];
}

编译,启动GDB并在return上放置断点。如果您键入p sizeof(p2),则GDB将打印8而不是4,如果您启动程序,将打印。如果您在GDB p sizeof(*p2)中写入,则输出为4(数组的大小)。我认为这是因为GDB将P2视为指针(引用是在场景后面实现的)。

用编译器GCC 4.8.2和clang 4.3在GDB 7.7 Linux Arch。,Ubuntu 13.10,

上测试4.3

这是正确的还是GDB中的错误?

这是您程序的修改版本。我将数组大小从4更改为17,以确保其大小与其他任何东西都可以区分。我还更改了类型和变量名称以使代码更易于遵循,并添加了#include <iostream>,因此它实际上是编译的。我还删除了一些不必要的东西。

#include <iostream>
int main()
{
    typedef unsigned char char17[17];
    char17 arr17;
    char17& arr17_ref = arr17;
    std::cout << "sizeof(arr17) = "
              << sizeof arr17
              << ", sizeof(arr17_ref) = "
              << sizeof(arr17_ref)
              << "n";
    return 0;
}

当我在系统上编译并运行它时,输出为17

当我在gdb下运行它时,我得到8(系统上的指针大小):

$ gdb ./c
GNU gdb (GDB) 7.5-ubuntu
[snip]
Reading symbols from /home/kst/c...done.
(gdb) b 12
Breakpoint 1 at 0x40097e: file c.cpp, line 12.
(gdb) r
Starting program: /home/kst/c 
sizeof(arr17) = 17, sizeof(arr17_ref) = 17
Breakpoint 1, main () at c.cpp:12
12          return 0;
(gdb) p sizeof(arr17)
$1 = 17
(gdb) p sizeof(arr17_ref)
$2 = 8
(gdb) c
Continuing.
[Inferior 1 (process 23420) exited normally]
(gdb) q
$ 

是的,这是GDB中的一个错误。GDB应该在运行程序中评估表达式;在这种情况下,它无法做到。

(我在Linux Mint上使用GCC 4.7.2和GDB 7.5。)

更新:

OP提交了一个错误报告:https://sourceware.org/bugzilla/show_bug.cgi?id=16675它已经固定了。该补丁被批准并承诺2014-04-14。我仍然在GDB 7.7.1中看到该错误,但已修复在7.11.1。