gdb 地址输出与 std::cout 不同 -> 我的错误在哪里?

问题描述 投票:0回答:1

我仍在寻找矢量调整大小错误,请参阅我的上一篇文章。
在我设置局部变量后,矢量大小被覆盖。
现在我通过 cout 和 gdb 检查局部变量的地址。
我不知道为什么cout打印的var地址与gdb不一样。
#include <iostream>
#include <vector>

#pragma pack(4)
typedef struct
{
    struct{
        unsigned char bit_1 : 1;
        unsigned char bit_2 : 1;
        unsigned char bit_3 : 1;
        unsigned char reserve : 5;
    };
    unsigned int w;
}MY_STRUCT;

class c{
    public:
        void init(void);
    protected:
        std::vector<unsigned char> m_d;
};

void c::init()
{
    m_d.clear();
    m_d.resize(8192);
}

class a;

class b : public c{
    public:
        b();
        void init(a* value);
    private:
        a* m_ptr;
};

b::b()
{
    m_ptr = nullptr;
}

void b::init(a* value)
{
    std::cout << "address m_ptr " << &m_ptr << std::endl;
    std::cout << "address m_d   " << &m_d << std::endl;
    m_ptr = value;
    c::init();
}

class a{
    public:
        void init(void);
    private:
        b m_i;
};

void a::init(void)
{
    m_i.init(this);    
}

int main() {
    a var;
    var.init();
    return 0;
}

打印:

address m_ptr 0xbefffca0
address m_d   0xbefffcac

gdb 输出:

(gdb) print &m_ptr 
$2 = (machine **) 0xbefffcac
(gdb) print &m_d   
$4 = (std::vector<unsigned char, std::allocator<unsigned char> > *) 0xbefffcac

为什么堆栈或堆会损坏,我没有找到原因。我通过 gdb 检查步骤槽操作。

做了什么:

  • 开始新项目,仅使用上面的声明 -> 工作
  • 注释掉所有不需要的文件 -> 正在工作
  • 再注释掉一个头文件,无论是哪一个 -> 都不起作用
  • 项目中又多了一个标头 -> 不起作用
  • 我更改了头文件 -> 不起作用

从 m_ptr 赋值后,var m_d 被覆盖并且调整大小操作不起作用,我遇到了分段错误。
该软件是交叉编译的,如果我再注释一个头文件,它似乎正在运行, 我可以交换注释掉的头文件,它是相等的。

一些如何摆脱的想法,可能是编译器错误? 我如何检查为什么堆栈或变量地址错误?

谢谢,再次为我的帖子感到抱歉:-(
我很绝望

我尝试gdb,设置断点,设置变量监视,新项目,注释掉,发布在stackoverflow上

c++ segmentation-fault arm gdb cross-compiling
1个回答
0
投票

使用

gcc (GCC) 13.2.1 20240316 (Red Hat 13.2.1-7)
GNU gdb (Fedora Linux) 14.1-4.fc39
不会重现该问题:

gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b b::init
Breakpoint 1 at 0x40126a: file t.cc, line 46.
(gdb) run
Starting program: /tmp/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, b::init (this=0x7fffffffdd00, value=0x7fffffffdd00) at t.cc:46
46          std::cout << "address m_ptr " << &m_ptr << std::endl;
(gdb) n
address m_ptr 0x7fffffffdd18
47          std::cout << "address m_d   " << &m_d << std::endl;
(gdb) n
address m_d   0x7fffffffdd00
48          m_ptr = value;
(gdb) p &m_ptr
$1 = (a **) 0x7fffffffdd18
(gdb) p &m_d
$2 = (std::vector<unsigned char, std::allocator<unsigned char> > *) 0x7fffffffdd00

如果您从 GDB 和使用您的测试用例的程序获得不同的输出,则您正在使用的 GCC 或 GDB 中存在错误。两者都是古老;你应该使用更新的东西。

© www.soinside.com 2019 - 2024. All rights reserved.