8

サーバーで継続的に実行されるpythonプログラムがあり、一部のデータをMYSQLデータベースに入れ、一部をロードします。また、TCP/IP 接続を使用しています。問題は、約 24 時間後に実行時エラーが発生することです。

Microsoft Visual C++ Runtime Library!

Runtime Error!

Program: C:\python27\pythonw.exe

This application has requested the Runtime to terminate it in an unusual way.

OK を押して python shell を閉じます。そして、すべてのpythonファイルを閉じてWindowsタスクマネージャーを確認すると、まだpythonw.exeファイルが開いていることがわかります!!!

IDLE を使用してアプリケーションを実行しています。

4

3 に答える 3

5

問題

このアプリケーションは、異常な方法で終了するようランタイムに要求しました。

Windows アプリケーションの実行中にこのエラーが発生した場合は、おそらく Python ライブラリのどこかで、場合によっては Python ランタイムからabort()ルーチンが呼び出されたことが原因です。詳細と呼び出しの動作については、中止に関する MSDN ドキュメントabortを参照してください。

デモ

あなたが必要だろう

  1. Visual Studio 2008 (エクスプレス版)
  2. _SYM_PATH でMicrosoft Symbol Serverを正しく設定する
  3. パイソン 2.7
  4. 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 のデバッグ バージョンを使用したためです。代わりに、リリース バージョンを使用していた場合、通常は

ここに画像の説明を入力

解決

SIGABRTWindowsでは、知る限り、シグナルハンドラーで処理できません。したがって、唯一の賭けは、すでにインストールされていると思われる JIT を使用することです。次のポップアップが表示されます。

ここに画像の説明を入力

[デバッグ] を選択すると、インストールされている JIT デバッガーが開きます。その後、失敗したスタックをダンプして、失敗したモジュールを特定できます。完了したら、モジュールを呼び出した可能性のある python モジュールを関連付けることができます。

于 2013-10-02T05:58:29.357 に答える