Articles of 堆腐败

应用程序validation程序debugging扩展

我在Visual Studio 2010中编写Windows C ++程序,并有堆损坏。 Application Verifier的!heap和!avrfdebugging器扩展有几个工具,这些工具对于跟踪这个工作非常有用,但是我不清楚如何有效地使用Application Verifier。 例如,Application Verifier文档指出: 您可以使用!avrf -hp -a Address显示影响指定地址的所有堆空间操作。 在哪里input这个命令? (是的,我知道地址需要被一个实际的地址replace。)是否需要前缀的任何东西?

堆损坏在Windows而不是Linux

下面是一些简单的OpenCV代码,用于从video文件创build帧,并在帧上运行SURF特征检测器和提取器。 当我在Linux和OSX上运行这个代码时,它运行正常,但是在Windows上,我在两条注释行上得到了一个堆损坏错误。 VideoCapture capture(vidFilename.c_str()); Mat frame; capture >> frame; SurfFeatureDetector *detector = new SurfFeatureDetector(minHessian); vector<KeyPoint> frameKeypoints; detector->detect(frame, frameKeypoints); delete(detector); // Heap Corruption Detected SurfDescriptorExtractor *extractor = new SurfDescriptorExtractor(); Mat frameDescriptors; extractor->compute(frame, frameKeypoints, frameDescriptors); delete(extractor); // Heap Corruption Detected 我不知道在代码中可能会导致这种情况。 我正在使用VS 2010编译代码,是否有什么可能导致这种情况发生VS?

信号处理期间堆损坏

我有一个multithreading的Windows服务器,我正在工作,并发现,当我通过控制cclosures程序时,发生了一定的标准,它崩溃。 如果我的服务器从客户端收到数据包,然后使用control-c,则会崩溃。 如果我启动服务器,让它等待数据包一段时间,然后使用control-c,它会正常退出。 这有什么奇怪的是,我的所有线程都报告说,即使程序抛出一个exception(除非这是正常的),它们将以状态0退出。 First-chance exception at 0x75A16DA7 (kernel32.dll) in server.exe: 0x40010005: Control-C. HEAP[server.exe]: HEAP: Free Heap block 96a818 modified at 96a908 after it was freed server.exe has triggered a breakpoint. The thread 0xc34 has exited with code 0 (0x0). The thread 0x1c64 has exited with code 0 (0x0). The thread 0xdbc has exited with […]

C ++ / msvc6应用程序崩溃,由于堆腐败,任何提示?

首先让我说,我正在写几个月的试图找出在我们的应用程序发生崩溃的根源这个问题。 我会尽可能详细地说明我已经发现的情况。 关于应用程序 它运行在Windows XP Professional SP2上。 它使用带有Service Pack 6的Microsoft Visual C ++ 6.0构build。 这是基于MFC的。 它使用几个外部dll(例如Xerces,ZLib或ACE)。 它有很高的性能要求 。 它做了很多networking和硬盘I / O,但它也是CPU密集型的。 它有一个exception处理机制,当未处理的exception发生时产生一个小型转储。 更新:这是一个高度multithreading的应用程序,我们正在使用互斥体来保护并发访问(当然,我们可能会在某个地方失败…) 关于事故的事实 它只发生在多处理器/多核机器上,并在繁重的工作中。 它发生在随机(我们和我们的客户都没有find一个模式),几个小时运行后。 我们不能在testing实验室重现崩溃。 它只发生在一些生产系统上(但总是在多核机器上) 尽pipe整个堆栈并不总是相同的,但它总是以相同的点崩溃 。 让我添加崩溃的线程的堆栈(使用WinDbg获得,对不起,我们没有符号) exception代码:c0000005 ACCESS_VIOLATION 地址:006a85b9 访问types:写入 访问地址:2e020fff 故障地址:006a85b9 01:002a75b9 C:\ MyDir \ MyApplication.exe ChildEBP RetAddr与孩子联系 警告:堆栈展开信息不可用。 以下框架可能是错误的。 030af6c8 7c9206eb 77bfc3c9 01a80000 00224bc3 MyApplication + 0x2a85b9 030af960 […]

如何在Windows 7中打开GCStress?

我正在debugging一个GC堆腐败,并来到了我想尝试在WinDbg + PageHeap + AppVerifier + GCStress下运行该程序的步骤。 我发现在文章软件崩溃:错误模块mscorwks.dll,版本1.1.4322.2379 ,我可以启用GCStress像这样: reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v HeapVerify /t REG_DWORD /d 1 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v StressLog /t REG_DWORD /d 1 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v GCStress /t REG_DWORD /d 3 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v FastGcStress /t REG_DWORD /d 2 (我正在尝试这种方法,它需要程序永远启动,我删除了registry中的最后两个条目,使其工作,可能是方法本身有问题。 或者在没有非托pipe模块的gc_heap :: garbage_collect中的.NET 4 Runtime中的Access […]

GFlags设置捕捉堆损坏(页面堆除外)?

在一个生产站点,我们的应用程序(*)反复崩溃,但不可重复。 分析崩溃转储清楚地表明,这是一个堆腐败:崩溃是在不同的位置,但总是访问ntdll!RtlpLowFragHeapFree kernel32!HeapFree / ntdll!RtlpLowFragHeapFree 。 赢得Dbg !analyze -v也报告堆腐败。 我们迄今为止所尝试的是使用GFlags选项Page Heap来运行应用程序。 问题是页堆的内存开销是这样的,应用程序将不再运行(达到32位进程的虚拟内存限制)。 所以, 我们不能使用Page Heap 。 哪些其他的标志将是有用的添加,以便我们要么 在腐败网站发生崩溃 或者至less可以从崩溃转储中获得更多的信息,这些崩溃转储最终将在我们在HeapFree崩溃时生成? 我们正在尝试标志: 启用堆标记 启用堆尾检查 希望下一次故障转储能够包含更多的错误信息。 我考虑过这些标志,但是现在就把它们留下了: 启用堆参数检查 …当系统每次调用堆函数时,我都会期待一些开销 启用堆检查 …不知道这是否真的会给我买东西 在通话中启用堆validation …即使文档警告高开销 我(也)有一个问题是,我不确定这些标志如何帮助发生内存损坏。 页面堆显然会产生访问冲突,当一些东西写入到警卫页面,但其他标志如何操作? 我是否必须使用Application Verifier来运行这些其他标志的帮助? 或者当检查代码检测到什么时会引发exception? 这些标志的哪个组合最有意义,这样应用程序仍然可以在生产中正常运行并消耗内存。 (*):这是工业自动化中的32位Windows桌面应用程序。 在这种情况下运行在Win7 64bit(它在很多其他站点上都可以正常运行)。

发现堆腐败

这是我以前的问题的延伸, 应用程序崩溃没有解释 。 我有很多崩溃,大概是由应用程序服务器上的堆损坏引起的。 这些崩溃只发生在生产中; 他们不能在testing环境中复制。 我正在寻找一种方法来追踪这些崩溃。 应用程序validation程序被build议,它会很好,但它是无法使用我们的生产服务器。 当我们尝试使用应用程序validation程序在生产环境中启动它时,即使这是一个相当强大的服务器(64位应用程序,16 GB内存,8个处理器),它变得如此之慢以至于完全无法使用。 在没有应用程序validation的情况下运行它,它只使用大约1 GB的内存,不超过任何处理器周期的10-15%。 有没有其他工具可以帮助查找堆腐败,而不会增加巨大的开销?