問題
このアプリケーションは、異常な方法で終了するようランタイムに要求しました。
Windows アプリケーションの実行中にこのエラーが発生した場合は、おそらく Python ライブラリのどこかで、場合によっては Python ランタイムからabort()
ルーチンが呼び出されたことが原因です。詳細と呼び出しの動作については、中止に関する MSDN ドキュメントabort
を参照してください。
デモ
あなたが必要だろう
- Visual Studio 2008 (エクスプレス版)
- _SYM_PATH でMicrosoft Symbol Serverを正しく設定する
- パイソン 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()
次のポップアップが表示されます。
あなたのケースとの唯一の違いは、悪名高いオプション [Abort|Retry\Ignore] を提供することです。それは、DLL のデバッグ バージョンを使用したためです。代わりに、リリース バージョンを使用していた場合、通常は
解決
SIGABRT
Windowsでは、知る限り、シグナルハンドラーで処理できません。したがって、唯一の賭けは、すでにインストールされていると思われる JIT を使用することです。次のポップアップが表示されます。
[デバッグ] を選択すると、インストールされている JIT デバッガーが開きます。その後、失敗したスタックをダンプして、失敗したモジュールを特定できます。完了したら、モジュールを呼び出した可能性のある python モジュールを関連付けることができます。