相关疑难解决方法(0)

Win32下的堆损坏; 如何定位?

我正在研究破坏堆的多线程 C++应用程序.找到这种腐败的常用工具似乎不适用.源代码的旧版本(18个月之前)表现出与最新版本相同的行为,因此这已经存在了很长时间并且没有被注意到; 在缺点方面,源增量不能用于识别何时引入错误 - 存储库中存在大量代码更改.

崩溃行为的提示是在这个系统中产生吞吐量 - 数据的套接字传输,它被导入内部表示.我有一组测试数据会定期导致应用程序异常(各种地方,各种原因 - 包括堆分配失败,因此:堆损坏).

行为似乎与CPU功率或内存带宽有关; 机器越多,崩溃就越容易.禁用超线程核心或双核核心可降低(但不消除)损坏的速度.这表明与时间相关的问题.

现在这里有一个问题:
当它在一个轻量级的调试环境下运行时(比方说Visual Studio 98 / AKA MSVC6),堆损坏相当容易重现 - 在事情失败和异常失败之前经过十或十五分钟,就像alloc;在复杂的调试环境下运行时一样(Rational Purify,VS2008/MSVC9或者甚至是微软应用程序验证程序)系统变得内存速度受限并且不会崩溃(内存限制:CPU没有达到上面50%,磁盘指示灯不亮,程序运行速度快,盒子消耗1.3G2G RAM) .因此,我可以选择能够重现问题(但不能确定原因)或能够识别原因或我无法重现的问题.

我目前最好的猜测是下一步是:

  1. 得到一个疯狂的grunty框(以取代当前的开发框:2Gb RAM E6550 Core2 Duo); 这样可以在强大的调试环境下运行时重现崩溃导致错误行为; 要么
  2. 重写操作符newdelete使用VirtualAllocVirtualProtect在完成后将内存标记为只读.运行MSVC6并让操作系统捕获正在写入释放内存的坏人.是的,这是绝望的标志:谁是地狱重写newdelete?!我想知道这是否会使它像Purify等人一样慢.

而且,不是:内置Purify仪器的运输不是一种选择.

一位同事刚刚走过去问"Stack Overflow?我们现在收到堆栈溢出了吗?!?"

现在,问题是:我如何找到堆腐败者?


更新:平衡new[],delete[]似乎已经有很长的路要走解决问题.而不是15分钟,应用程序现在大约两个小时崩溃.还没有.还有什么建议?堆损坏仍然存在.

更新:Visual Studio 2008下的发布版本似乎要好得多; 目前的怀疑依赖于STL随船携带的实施VS98. …

c++ memory windows debugging multithreading

59
推荐指数
4
解决办法
4万
查看次数

为什么析构函数不会被异常调用?

我希望A::~A()在这个程序中被调用,但它不是:

#include <iostream>

struct A {
  ~A() { std::cout << "~A()" << std::endl; }
};

void f() {
  A a;
  throw "spam";
}

int main() { f(); }
Run Code Online (Sandbox Code Playgroud)

但是,如果我将最后一行更改为

int main() try { f(); } catch (...) { throw; }
Run Code Online (Sandbox Code Playgroud)

然后A::~A() 称为.

我正在从Visual Studio 2005编译"Microsoft(R)32位C/C++优化编译器版本14.00.50727.762 for 80x86".命令行是cl /EHa my.cpp.

编译器像往常一样吗?标准对此事有何评价?

c++ destructor exception stack-unwinding visual-c++

50
推荐指数
2
解决办法
1万
查看次数

如何确定进程终止的原因

我有一个问题,在调用第三方库例程期间,我的进程终止.我完全无法在调试器中捕获这个.这可能与此问题有关:如何调试意外终止的win32进程?.

当我调用此库中的调用时,正在调试的进程只会终止.如果此终止是由于未处理的异常或内存访问冲突导致的,则调试器会捕获它.所以我最好的猜测是该过程以某种方式正常终止.

我尝试过的:

  • ExitThread和上设置断点ExitProcess
  • 为未处理的异常和无效参数设置处理程序(set_terminate_set_invalid_parameter_handler)
  • 改变_set_abort_behavior_set_error_mode.
  • 指示调试器停止对所有抛出的异常执行.

但无济于事,没有一个处理程序被调用,也没有触发任何断点.

我观察到的: 当进程崩溃时,我在调试输出窗口中看到两件事:

  1. 没有关系(见下面的更新) 我看到EEFileLoadException被扔了.快速谷歌这个例外并没有给我一个明确的答案,这个例外意味着什么.

    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac..
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
    First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: …
    Run Code Online (Sandbox Code Playgroud)

debugging winapi visual-studio-2010

10
推荐指数
1
解决办法
9259
查看次数