我有一个不确定的内存损坏问题。因为它并不总是相同的地址,而且很少出现,所以我不能简单地用 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/