1

在调试和发布两种模式下编译我的代码都是成功的。调试模式执行并且工作正常,但是当我执行发布模式时,它说“应用程序无法正确启动 0x80000003”。

这个错误是什么以及为什么调试模式可以正常工作但不能发布。用于调试和发布的 DLL 存在于同一个目录名“bin”中。两种模式的“lib”也放置在同一目录中。

我尝试了很多方法但没有成功?指导我如何解决这个问题?谢谢。

4

1 回答 1

0

为什么调试模式工作正常但不发布

一个构建工作而另一个构建不工作的原因可能有很多。数据结构的形状和大小可能#ifdef因为编译器发出不同的代码而不同,正在执行的代码也可能不同——同样是因为类似的结构#ifdef或编译器发出的代码。

当您的代码中有错误时,这可能很重要。假设您有一个错误计算数组的长度(或结构的大小或其他)。您进行一些指针运算并使用该指针将一些数据写入内存 - 只是您写入错误的位置。该错误是否会破坏您的程序可能取决于您覆盖的内存中的内容。

如果幸运的话,您的程序几乎会立即崩溃,因为您覆盖的内容对于出现错误后立即执行的某些代码很重要。如果你只是有点幸运,你的程序会在一段时间后在程序的一个完全不同的部分崩溃,因为你覆盖的内容对于远离你的错误的代码很重要。如果你真的不走运,你的程序直到几年后才会崩溃,那时完全不相关的变化会在内存中移动东西,所以现在你突然覆盖的东西重要。

还有很多其他可能的原因有时被称为Heisenbugs

这是什么错误

查找诸如 0x80000003 之类的错误的一个地方是 WinError.h 文件,您可以在您使用的 SDK 中找到该文件(Visual Studio 2010 附带的一个或您以后安装的一个)。查看 WinError.h,您会发现它E_INVALIDARG被定义为_HRESULT_TYPEDEF_(0x80000003L).

但这不一定有帮助,因为我们对返回该错误的原因或返回该错误的原因知之甚少,甚至您的 0x80000003 实际上是 E_INVALIDARG - 它可能是具有相同值的其他错误,或某些代码误用 E_INVALIDARG 或其他东西。

另一种可能性是 0x80000003 是一个硬编码的断点异常被抛出 - 很可能是因为你的程序已经到了一个“这永远不会发生”的地方,唯一有意义的是抛出一个异常并崩溃。如果您查看 NtStatus.h(在与 WinError.h 相同的位置),您会发现它STATUS_BREAKPOINT被定义为((NTSTATUS)0x80000003L)

如何解决这个问题

诀窍是找出导致 0x800000003 的原因(以及它在代码中发生的位置),以便您可以缩小它发生的原因。很可能这是一个例外,但为什么要贸然下结论呢?

您可以在调试器中运行发布构建,就像运行调试构建一样——也就是说,使用 Release 目标构建代码,然后按 F5 或 Debug | 开始调试。查看输出窗口,您可能会看到一些有助于解释错误的信息。

您还可以使用调试 | Exceptions 菜单添加一个值为 80000003 的新 Win32 异常,并将其设置为在抛出时中断,而不是在未处理时中断。这样,当抛出该异常时(如果实际上已抛出),您应该在调试器中停止。

当然,即使在调试器中运行你的程序也足以改变事情,这样你的问题就不会发生。

于 2012-09-04T22:41:26.423 回答