保护类内存阵列以检测分段错误



我在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您期望损坏的内存区域,它就会在第一次修改时中断,开销非常低。

最新更新