Написать Windows Mini дампов с Python - PullRequest
2 голосов
/ 10 декабря 2011

Я пытался создать функцию, которая будет писать файл мини-дамп для данного идентификатора процесса. Пока у меня есть это:

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.

У кого-нибудь есть идеи, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Единственные проблемы, с которыми я когда-либо сталкивался, это межплатформенные дампы, т.е. дамп 32-битных процессов, когда ваш локальный процесс является 64-битным процессом или наоборот.Если вы посмотрите по сети, то сможете найти множество ссылок на стандартную рекомендацию: взять 32-битный дамп из 32-битного процесса и 64-битный из 64-го. См. Не собирайте дампы 32-битного процесса с помощью 64-битной задачи.manager и Захват дампов памяти для 32-разрядных процессов на компьютере x64 Не знаю почему, но мне бы хотелось.(хотя технически в x64-окнах все они являются 64-битными процессами, 32-битные просто лгут сами себе ... с дополнительным стеком потоков и TEB и PEB.

указатели исключенийи текущий идентификатор потока имеют значение, только когда вы выполняете дамп изнутри процесса. Если вы полностью прочитали запись MSDN, она предлагает создать вспомогательный поток и исключить его из дампа, чтобы получить смысловой стек текущего потока, который, очевидно, имеет значение только в том случае, если вывыгрузка текущего процесса. Кроме того, выгрузка внешнего процесса, который иногда очень полезен при диагностике зависающих процессов, не будет содержать информацию PEXCEPTION_POINTER. Также я сделал множество мини-дампов внешних процессов без установки PEXCEPTION_POINTER или обратного вызова,но обратный вызов очень полезен.

0 голосов
/ 06 января 2012

Вам не хватает подготовленной структуры MINIDUMP_EXCEPTION_INFORMATION в качестве 5-го параметра для MiniDumpWriteDump().Это необходимо для успешного дампа.

Установите в поле ThreadId значение GetCurrentThreadId().Установите для поля ClientPointers значение ЛОЖЬ.Настоящий трюк здесь - это поле ExceptionPointers.Единственный известный мне способ получения PEXCEPTION_POINTERS - это обратный вызов, назначенный через AddVectoredExceptionHandler().Обратный вызов получает один параметр PEXCEPTION_POINTERS.Итак, вам нужно переместить весь код дампа в этот обратный вызов, чтобы иметь доступ к PEXCEPTION_POINTERS во время дампа.К сожалению, это также означает, что вы находитесь во власти необработанного исключения, запускающего дамп (если вы не можете найти другой способ получить PEXCEPTION_POINTERS).

...