c++ - 保护类内存阵列检测分段错误
问题描述
我在 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;
.
};
但我确定内存保护工作正常的测试不会导致段错误。
有人可以帮忙吗?
解决方案
在源代码级别执行此操作有点愚蠢。如果您想找到将某些内容写入特定内存地址的确切时刻,请使用数据断点(gcc 称它们为“观察点”)。只需watch *(int*)0xWHATEVER
对您期望损坏的内存区域执行操作,它就会在第一次修改时中断,并且开销非常低。
推荐阅读
- excel - 以波浪号分隔的导出
- flask - 烧瓶将shapefile上传到postgis
- javascript - jQuery if 语句在 for 循环中不起作用
- java - iText,加载现有的 PDF 并向其中添加文本
- python - github 上的一些要点有很多分支。我怎样才能找到最近活跃的和/或大量修改的?
- scala - scala计算元素的出现次数
- javascript - 空间复杂度js函数
- java - 我如何使用 JQuery 要求和打印一个对象数组 beetwen 一个 jsp 页面和一个 servlet?
- regex - 两个字符串之间的正则表达式,不包括字符串
- macos - 如何对行中没有“@”字符的所有行进行 grep