【问题标题】:C++ error on Ms Visual Studio: "Windows has triggered a breakpoint in javaw.exe"Visual Studio 上的 C++ 错误:“Windows 已在 javaw.exe 中触发断点”
【发布时间】:2012-04-16 10:29:42
【问题描述】:

我一直致力于开发我的软件 C++ 和 Java(使用 Microsoft Visual Studio 2008 和 Eclipse 构建),并且一直在尝试将其从 32 位系统迁移到 64 位系统。

编译阶段没问题,但在执行时我收到一条错误消息:

"Windows 已在 javaw.exe 中触发断点。这可能是由于 堆损坏,这表明 javaw.exe 或任何 它已加载的 DLL -。 这也可能是由于用户在 javaw.exe 具有焦点时按 F12。 输出窗口可能有更多诊断信息。 [BREAK] [CONTINUE] [IGNORE]"

您可以在此处查看错误快照:

你知道这个错误是什么意思吗? “堆损坏”是什么意思? 你以前遇到过这种错误吗?

非常感谢!

【问题讨论】:

  • 这个异常也可以通过简单地分配 N 个数据槽(任何类型)并实际使用 M>N 个槽来发生。一切都可以编译,但在运行时会引发错误。阿夫纳

标签: c++ visual-studio-2008


【解决方案1】:

这是 Windows 堆分配器的一个非常好的功能,从 Vista 开始就可用。它告诉你你的代码有一个指针错误。好吧,希望是你的代码而不是 JVM 有错误 :) 你最好假设它是你的代码。

实际原因介于轻微之间,例如试图释放已经从另一个堆中释放或分配的内存(当您与另一个程序进行互操作时并不罕见),到非常讨厌的,例如之前通过溢出将堆炸成碎片一个堆分配的缓冲区。

诊断的粒度不够细,无法准确告诉您出了什么问题,只是出了点问题。您通常会通过仔细的代码审查和人为地禁用代码块来追踪它,直到错误消失。这就是显式内存管理的乐趣所在。如果 32 位版本是干净的(检查它),那么由于对指针大小的假设,这可能与 64 位代码相关联。 64 位指针不适合 int 或 long,因此它会被截断。并且使用截断的指针值将触发此断言。这是令人高兴的问题,您会在调用堆栈窗口中找到故障代码。

【讨论】:

    【解决方案2】:

    不幸的是,这通常意味着内存损坏。一些内存的双重释放、应该返回但不返回的函数或任何其他类型的未定义行为。

    解决这个问题最好的办法是使用内存分析工具,除非你知道这个损坏在哪里。

    【讨论】:

    • 他也可以用 Application Verifier 试试运气
    【解决方案3】:

    我明白了! 谢谢大家,我知道这是内存问题,也许是 malloc() 其实我看了here

    对于 32 位实现,存储桶大小因子必须是 8 的倍数,并且 16 的倍数,用于 64 位实现,以保证地址 从 malloc 子系统函数返回的所有数据类型都正确对齐。

    IBM.com:

    所以,我在问题点更改了 malloc() 的大小。我来自:

    (int**) malloc (const * sizeof(int))

    到:

    (int**) malloc (const * sizeof(int64_t))

    现在它可以工作了!

    非常感谢!

    【讨论】:

    • 你的构造都不正确。调用 malloc 的一般形式是(T*)malloc(count*sizeof(T))。在您的具体情况下,正确的形式是 (int**)malloc(count*sizeof(int*))
    【解决方案4】:

    当您尝试访问未分配的内存时,通常会发生这种错误。检查所有分配(和释放),尤其是指针到指针,以及可以访问动态分配内存的代码。在您的情况下,指针的大小是 64 位而不是 32 位,这应该是主要原因。

    【讨论】:

    • 我认为访问你不拥有的内存宁愿通过访问冲突异常来破坏运行时。
    • 进程很可能拥有内存作为堆的未分配部分,我想这就是他的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多