首页 > 解决方案 > 保护类内存阵列检测分段错误

问题描述

我在 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

因此,我添加了一个 char 缓冲区,以便我可以看到损坏:

struct S
{
    .
    char         _buffer[1000];
    std::mutex   _mutex;
    .
};

当分段错误发生时,我可以看到损坏的字节。但是,我无法确定腐败发生的时间

为了确定何时发生损坏,我想保护 char 缓冲区字节。我试过了:

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;
    .
};

但我确定内存保护工作正常的测试不会导致段错误。

有人可以帮忙吗?

标签: c++linuxdebuggingsegmentation-fault

解决方案


在源代码级别执行此操作有点愚蠢。如果您想找到将某些内容写入特定内存地址的确切时刻,请使用数据断点(gcc 称它们为“观察点”)。只需watch *(int*)0xWHATEVER对您期望损坏的内存区域执行操作,它就会在第一次修改时中断,并且开销非常低。


推荐阅读