问题
此应用程序已请求运行时以不寻常的方式终止它。
如果您在运行 Windows 应用程序时收到此错误,很可能是因为在您的 python 库中的某个地方,甚至可能从您的 python 运行时abort()
调用了例程。有关更多信息和调用行为,abort
请参阅MSDN 文档中止
演示
你需要
- Visual Studio 2008(快捷版)
- 在 _SYM_PATH 中正确设置Microsoft 符号服务器
- 蟒蛇 2.7
- 安装WinDBG,并将其设置为JIT
创建一个调用 C DLL,abort()
然后使用 ctypes 调用此 DLL
头文件abort_dll.h
#include<cstdlib>
#include <windows.h>
extern "C" __declspec(dllexport) void call_abort(void);
资源abort_dll.cpp
#include "abort_dll.h"
__declspec(dllexport) void call_abort(void)
{
abort();
}
资源dllmain.cpp
#include "abort_dll.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
现在编译并构建您的 DLL(在调试和发布版本中)。
假设我的 DLL 存在于以下位置
调试版本:C:\TEMP\Debug\abort_dll.dll 发布版本:C:\TEMP\Release\abort_dll.dll
在你的 IDLE 中执行以下代码
from ctypes import *
hDLL = WinDLL(r"C:\TEMP\Debug\abort_dll.dll")
hDLL.call_abort()
你一定会看到下面的Popup
与您的案例的唯一区别是,它为您提供了臭名昭著的选项 [Abort|Retry\Ignore]。这只是因为我使用了我的 DLL 的调试版本。相反,如果我使用的是发布版本,我通常会看到
解决方案
在 Windows 中,AFAIK 无法SIGABRT
使用信号处理程序处理。所以,唯一的选择是使用 JIT,我想你已经安装了。然后你会看到以下弹出。
如果您选择调试,这将打开您安装的 JIT 调试器。之后,您可以转储失败的堆栈,并确定失败的模块。完成后,您可以关联可能调用该模块的 python 模块。