#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上
使用
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 中存在错误。两者都是古老;你应该使用更新的东西。