【问题标题】:My C++ App Crashes Only in Release Mode and Windows 7我的 C++ 应用程序仅在发布模式和 Windows 7 下崩溃
【发布时间】:2011-05-04 07:04:35
【问题描述】:

我对我的应用在 Windows 7 的发布模式下崩溃感到非常沮丧。

在主函数中,我删除了所有内容:

int main(int argc, char **argv, char **envp) {
    return (0);
}

但我确实在主函数之外定义了很多指令、变量和函数。

它仅在 Windows 7 上的发布模式下崩溃。 Windows 7 上的调试模式没问题; Windows XP 上的调试和发布模式都可以。

由于无法调试,我不知道该怎么做。

错误是:

Unhandled exception at 0x00dc21ca in MyApp.exe: 0xC0000005: Access violation reading location 0x8496a9bb.

装配线:

00DC21CA  mov         eax,dword ptr [edx+0Ch] 

这太疯狂了,请帮忙。

彼得

P.S.:如果我删除了我在 main 之外定义的所有内容,那么没关系。

PS:

char* AllocArgsMemory()
{
    return (char*)malloc(2); // works: return NULL
                             // So it seems the malloc has some problems
}

【问题讨论】:

  • 也许您应该一次删除一件事,直到它起作用,这样您就知道该怪什么了。或发布代码。
  • 哇。现在有一个很好的。您是否包含除标准库之外的任何库?您可能想检查是否有东西(以某种方式)挂钩到在 main 之前运行的 _main 函数中。
  • 另外,检查你的构造函数。全局对象的构造函数是否会导致崩溃(会在 main 之前发生)?
  • 放到.NET框架上;)
  • 如果您的全局(命名空间级别)对象依赖于其他对象的初始化,则可能会发生这种情况。不同的编译器可以以不同的顺序初始化对象,这就是你在不同平台上看到不同行为的原因。您必须找出导致崩溃的对象。

标签: c++ debugging windows-7 crash release


【解决方案1】:

检查您正在使用的所有指针。您的应用程序崩溃的方式表明您正在取消引用空指针或超出预分配的内存范围(例如数组)。这可能是由于指针未初始化或订阅索引太大。

它在调试模式下不会崩溃,因为在调试模式下,调试器通常会使用预定义的值初始化未初始化的内存,例如0xcccccccc,在发布模式下不会发生。

【讨论】:

    【解决方案2】:

    即使它是发布二进制文件,您也应该创建一个完整的符号文件 (.pdb),以便在出现问题时拥有​​一个不错的调用堆栈。 要获得它:启动任何调试器(WinDbg、Visual Studio 等),将其设置为在访问冲突异常时停止,开始处理它,当异常发生时它应该中断并给你一个调用堆栈。 请记住,调试器可以运行任何可以执行的东西;即使您没有指向源代码和局部变量值的链接,您也可能有其他有用的信息。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      听起来可能是一些内置的设置/属性。我没有太多可以提供给你的东西(部分原因是缺乏信息),但如果它在 Windows 7 中以 DEBUG 模式工作,就像在 RELEASE 中设置所有构建设置/属性与 DEBUG 一样。如果它有效,您就知道这是构建设置的问题

      【讨论】:

      • 更可能是 DEBUG 构建中的设置隐藏了问题而不修复它——构建设置实际上并不是问题。
      猜你喜欢
      • 2020-04-04
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多