如何检测错误写入
How to Detect Wrong Write
在我的代码中,我有一个对象的内容完全是垃圾。我猜在代码的其他部分发生了错误的写入,幸运的是,它写入了我提到的对象的地址。
我想知道是否有什么工具可以告诉我内存地址收到的每一次写入,这样我就可以跟踪这个错误的起源。
大多数调试器都支持写入时的断点。
例如,在visual studio中,您必须在调试器中启动应用程序,插入(在接近可疑变量初始化的正常断点上),然后转到菜单中的"调试/新断点/新数据断点"。
在SoftIce中,您可以使用BPM命令。:)这也可能破坏内存访问。
根据您的平台,您应该能够使用VirtualProtect之类的东西锁定该内存区域(我认为它在linux上是mprotect)。这样,当内存区域被不正确地访问时,您将得到accessviolation/segfault。当您得到accessviolation/segfault时,您可以在调试器中捕获它们。
然而,要锁定内存区域,通常区域应该与内存页对齐(至少在窗口上),这可能是一个问题。
除此之外,您还可以在调试器中使用数据断点。
如果您在Windows上,您可以使用全局标志(gflags.exe,Windows调试工具的一部分)并打开PageHeap。(在"图像"选项卡上,键入.exe的名称,然后在它出现时单击"启用页面堆"复选框。)然后运行程序。
只要记得做完后再把它关掉。
相关文章:
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 如何从标准输入中检测格式化输入错误?
- 程序停止运行,但未检测到错误
- JNI 在应用程序中检测到错误:在为 innerclass 调用 NewObject 时使用了无效的 jobject
- 在C++中检测到堆损坏错误
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- Clang 无法检测到初始化并给出错误
- 如何检测内存分配/空闲错误的对象?
- 想要构建一些必要的库来检测功能.出现一些错误
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 保护类内存阵列以检测分段错误
- 舍入错误检测
- 从emxArray_uint8_T检测到错误:.text+0xc1):未定义对"emxInit_uint8_T1(emxArray_uint8_T**, int)"的引用?
- 排序程序的错误(检测到堆损坏)
- LLVM 的位码错误检测函数参数
- 类对象的可变级别内存错误检测
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 错误检测Visual Studio 2010
- 同名功能中的错误检测
- GetModuleFileName防病毒错误检测??获取当前进程PATH