在 gdb 中 sizeof(Apple::record_) 为零。但它运行良好

Posted

技术标签:

【中文标题】在 gdb 中 sizeof(Apple::record_) 为零。但它运行良好【英文标题】:In gdb sizeof(Apple::record_) is zero. But It runs well 【发布时间】:2011-09-28 03:14:47 【问题描述】:

我遇到了一个很奇怪的g++问题。

流动程序的输出是“24 8 3”,一切正常。但是当我使用 gdb 打印 sizeof(Apple::record_) 时,结果是 0。我的 gcc 版本是 4.5.2 (GCC)(MinGw),gdb 版本是 GNU gdb (GDB) 7.3 谁能帮帮我??

    #include <iostream>
    using namespace std;

    struct Record 
        int age;
        const char* name;
    ;
    struct Apple 
        static Record record_[];
    ;

    Record Apple::record_[] = 
             18, "liming i love apple" ,
             19, "liming" ,
             20, "liming a y z o pq x y z o o o "  ;
    int main() 
        cout << sizeof(Apple::record_) << " " << sizeof(Apple::record_[0]) << " "
             << sizeof(Apple::record_) / sizeof(Apple::record_[0]) << endl;
        return 0;
    

【问题讨论】:

对不起,我看错了你的问题。所以我删除了我的答案。 【参考方案1】:

在以下版本的 GDB 中,p sizeof(Apple::record_) 返回 48。(这不是 24,因为我系统上的 int 和指针各为 8 个字节)。

也许您使用的 GDB 版本在这方面有问题?

GNU gdb 6.3.50-20050815 (Apple version gdb-1705) (Fri Jul  1 10:50:06 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".

为了比较,这也是我的 gcc 版本。

i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

【讨论】:

【参考方案2】:

听起来像是 GDB 或编译器中的错误。

您的编译器是旧的(当前是 4.6.1)。您没有说您使用的是什么版本的 GDB,但它可能也不是最新的 (7.3.1)。

如果您可以使用当前版本的 GCC 和 GDB 重现问题,您应该提交错误报告。

【讨论】:

以上是关于在 gdb 中 sizeof(Apple::record_) 为零。但它运行良好的主要内容,如果未能解决你的问题,请参考以下文章

gdb调试小结

gdb使用_转

gdb 打印软数组的数组

gdb x 打印内存的值

gdb x 打印内存的值

calloc 调用失败,代码崩溃