繁体   English   中英

如何调试“此应用程序已请求运行时以不寻常的方式终止它。” 当我什至无法进入代码时?

[英]How to debug “This application has requested the Runtime to terminate it in an unusual way.” when I can't even step in the code?

我有一个 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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM