c++ - 如何调试非确定性内存损坏?

标签 c++ c debugging memory-corruption

我有一个不确定的内存损坏问题。因为它并不总是相同的地址,而且很少出现,所以我不能简单地用 gdb watchpoint 它。

问题是我的程序中 A 点和 B 点之间的值发生了变化。唯一应该改变它的是 C 点,它在那个时候不运行(至少对于经历意外修改的特定实例)。

我想做的是像 mprotect A 点的值这样机器将在它被修改时陷入陷阱,并且围绕 C 点的有意修改再次取消保护。当然, mprotect 不应按字面意思理解,因为我需要它来处理单词粒度。

简单地用gdb手动观察A点太麻烦了,问题的发生频率只有千分之一。

理想情况下,我希望在修改它的时候有一个堆栈跟踪。

有什么想法吗?

更新:我刚刚发现rr http://rr-project.org/ ,一种据称可以“确定”非确定性问题的工具。我要试一试。

更新 2: 那是一次短途旅行:

[FATAL /build/rr-jR8ti5/rr-4.1.0/src/PerfCounters.cc:167:init_attributes() errno: 0 'Success'] 
 -> Microarchitecture `Intel Merom' currently unsupported.

最佳答案

您正在经历未定义的行为,并且它是由其他地方引起的,调试它真的很难。

因为你显然是在 Linux 上,所以使用 valgrind它会对你有很大帮助。如果您使用的不是 Linux 或(valgrind 也支持的 OS X),请为您的系统搜索等效的内存错误检测软件。

关于c++ - 如何调试非确定性内存损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741370/

相关文章:

c - Gdb 条件正则表达式中断

debugging - Go - 编译一组函数时出错

c++ - 这是什么类型的排序,它的运行时间是多少?

c - C语言中bitset类型使用什么类型

c++ - 为什么这段代码卡在提到的地方?

c - 错误 : storage class specified for parameter

c - 在c中用指针参数传递函数指针

c++ - 函数退出时出现段错误的可能原因

c++ - "undefined behaviour"是否扩展到编译时?

c++ - 以十六进制修改 exe 后推送指令中的地址发生变化