4

我有一个 C++ 程序,一旦进程开始就会给出这个错误 - 显然是在任何用户代码执行之前。它仅在启用内联时发生。即使内置了调试符号,我也无法插入代码。一旦我在 Visual Studio 中按 F10,我就会收到错误并且程序停止。我检查了“调试/异常”中的所有异常/检查,但仍然没有休息。

通常我希望这样的事情是由于缺少运行时依赖关系,但我很肯定这里不是这种情况(使用 Dependency Walker 验证)。

编辑:我使用了 Steve Townsend 对 CDB 的推荐,现在我可以逐步了解程序的用户前代码部分。最终的堆栈跟踪是:

Child-SP          RetAddr           Call Site
00000000`0008e308 00000000`7541601a ntdll!ZwTerminateProcess+0xa
00000000`0008e310 00000000`7540cf87 wow64!Wow64EmulateAtlThunk+0x86ba
00000000`0008e340 00000000`7539276d wow64!Wow64SystemServiceEx+0xd7
00000000`0008ec00 00000000`7540d07e wow64cpu!TurboDispatchJumpAddressEnd+0x24
00000000`0008ecc0 00000000`7540c549 wow64!Wow64SystemServiceEx+0x1ce
00000000`0008ed10 00000000`7776ae27 wow64!Wow64LdrpInitialize+0x429
00000000`0008f260 00000000`777672f8 ntdll!LdrGetKnownDllSectionHandle+0x1a7
00000000`0008f760 00000000`77752ace ntdll!RtlInitCodePageTable+0xe8
00000000`0008f7d0 00000000`00000000 ntdll!LdrInitializeThunk+0xe
4

2 回答 2

2

您可以尝试设置Process Dumper并为您的 EXE 配置它以在任何进程退出时创建转储。然后从命令行启动该过程以排除 IDE 的任何工件。

这应该给你一个用于事后调试的转储,也许还有一个来自现有线程的调用堆栈,可能有用。

于 2011-06-28T15:29:17.307 回答
1

它可能与初始化全局变量的顺序有关。在 C++ 中,模块之间的顺序是未指定的。因此,如果一个全局的初始化器依赖于另一个模块中已经初始化的全局,那么你就有麻烦了。

可以在调用 main(或 wmain、WinMain 或您正在使用的任何东西)之前运行的 CRT 初始化代码中放置一个断点。您可以单步执行该代码并查看导致问题的原因。

另一个可能的原因是 DllMain 函数在 DLL_PROCESS_ATTACH 期间返回错误或引发异常。

于 2011-06-28T16:06:06.923 回答