我在Linux(CentOS 7.4,编译器Clang(上,并且在C++结构对象中遇到分段错误(不容易重现(。这是一个多态对象的类成员,我没有分配,但在我没有源代码的框架内实例化。这意味着我无法使用 sanitize 轻松进行编译,Valgrind 将初始化时间从几秒钟增加到 5 分钟(:
// C is allocated within a third party framework, I assume they use new()
//
class C : public ThirdPartyParentClass
{
S s;
}
struct S
{
.
std::mutex _mutex;
.
};
分段错误损坏了_mutex
。
因此,我添加了一个字符缓冲区,以便我可以看到损坏:
struct S
{
.
char _buffer[1000];
std::mutex _mutex;
.
};
当分段错误发生时,我可以看到损坏的字节。但是,我无法确定腐败何时发生。
为了确定何时发生损坏,我想保护字符缓冲区字节。我试过了:
struct S
{
S()
{
mprotect(&_buffer[0], 4096, PROT_NONE);
const int test = buffer[0]; // Trigger seg fault to test it works
}
.
char _buffer[4096]__attribute__((aligned(4096)));
std::mutex _mutex;
.
};
但是我确定内存保护正常工作的测试不会导致SEG故障。
有人可以帮忙吗?
在源代码级别执行此操作有点愚蠢。如果你想找到某些东西被写入特定内存地址的确切时刻,请使用数据断点(gcc称之为"观察点"(。只需watch *(int*)0xWHATEVER
您期望损坏的内存区域,它就会在第一次修改时中断,开销非常低。