3

特定のプロセス ID のミニダンプ ファイルを書き込む関数を作成しようとしています。これまでのところ、私はこれを持っています:

import win32con, win32api, win32file, ctypes
dbghelp = ctypes.windll.dbghelp 

def createMiniDump(pid, file_name):
    # Adjust privileges.
    adjustPrivilege(win32security.SE_DEBUG_NAME)
    pHandle = win32api.OpenProcess(
                win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ ,
                0, pid)
    print 'pHandle Status: ', win32api.FormatMessage(win32api.GetLastError())
    fHandle = win32file.CreateFile(file_name,
                               win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                               win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE,
                               None,
                               win32file.CREATE_ALWAYS,
                               win32file.FILE_ATTRIBUTE_NORMAL,
                               None)

    print 'fHandle Status: ', win32api.FormatMessage(win32api.GetLastError())
    success = dbghelp.MiniDumpWriteDump(pHandle.handle,   # Process handle
                                     pid,                 # Process ID
                                     fHandle.handle,      # File handle
                                     0,         # Dump type - MiniDumpNormal
                                     None,      # Exception parameter
                                     None,      # User stream parameter
                                     None,      # Callback parameter
                                     )
    print 'MiniDump Status: ', win32api.FormatMessage(win32api.GetLastError())
    return success

プロセスとファイル ハンドルが正常に作成されます。ただし、MiniDumpWriteDump を呼び出すと、次のエラーが設定されます。 Only part of a ReadProcessMemory or WriteProcessMemory request was completed.

なぜこれが起こっているのか、誰にも考えがありますか?

4

2 に答える 2

3

私が遭遇した唯一の問題は、クロス アーキテクチャ ダンプ、つまり、ローカル プロセスが 64 ビット プロセスであるときに 32 ビット プロセスをダンプすること、またはその逆です。ネットを見回すと、32 ビット プロセスから 32 ビット ダンプを取得し、64 から 64 を取得するという標準的な推奨事項への参照がたくさん見つかります。64 ビット タスク マネージャーで 32 ビット プロセスのダンプを収集しないでくださいキャプチャx64 マシンでの 32 ビット プロセスのメモリ ダンプ 理由はわかりませんが、そうしたいのです。(技術的にはx64ウィンドウではすべて64ビットプロセスですが、32ビットプロセスは自分自身に嘘をついています..追加のスレッドスタックとTEBおよびPEB.

例外ポインターと現在のスレッド ID は、プロセス内からダンプする場合にのみ関連します。MSDN エントリを完全に読むと、ヘルパー スレッドを作成し、それをダンプから除外して、現在のスレッド スタックを有意義に取得することが提案されています。これは、現在のプロセスをダンプしている場合にのみ意味があります。また、ハングしているプロセスの診断に非常に役立つ場合がある外部プロセスのダンプには、PEXCEPTION_POINTER 情報がありません。また、PEXCEPTION_POINTER を設定せずに、またはコールバックせずに、外部プロセスのミニダンプをたくさん実行しましたが、コールバックは非常に便利です

于 2012-01-12T12:45:22.387 に答える
0

MINIDUMP_EXCEPTION_INFORMATIONの 5 番目のパラメーターとして準備された構造体がありませんMiniDumpWriteDump()。ダンプを成功させるために必要です。

そのThreadIdフィールドを に設定しますGetCurrentThreadId()。そのClientPointersフィールドを FALSE に設定します。ここでの本当のトリックはExceptionPointersフィールドです。を取得する唯一の方法は、PEXCEPTION_POINTERSを介して割り当てられたコールバックを使用することAddVectoredExceptionHandler()です。PEXCEPTION_POINTERSコールバックには 1 つのパラメーターが渡されます。したがって、すべてのダンプ コードをそのコールバックに移動して、ダンプPEXCEPTION_POINTERS時に にアクセスできるようにする必要があります。残念ながら、これは、ダンプをトリガーするハンドルされていない例外に翻弄されていることも意味します (を取得する別の方法を見つけられない限りPEXCEPTION_POINTERS)。

于 2012-01-06T17:49:12.790 に答える