gpt4 book ai didi

c - MiniDumpWriteDump 段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:35 24 4
gpt4 key购买 nike

我正在尝试转储一个进程,例如 calc.exe

当我运行我的程序时,我得到

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401640 in MiniDumpWriteDump ()

这是代码

#include <windows.h>
#include <dbghelp.h>

int main(){
HANDLE hFile = CreateFileA(
"calc.dmp",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

DWORD procID = 196;

HANDLE hProc = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
procID
);

MiniDumpWriteDump(
hProc,
procID,
hFile,
MiniDumpWithFullMemory,
NULL,
NULL,
NULL
);

CloseHandle(hFile);
}

最佳答案

您的示例适用于 32 位和 64 位 Windows,但必须使用相同的“位数”进行编译(64 位在 64 位 Windows 上,32 位在 32 位 Windows 上)。

我只添加了一个窗口枚举和一种提供 procID 作为参数的方法。应检查返回值的函数是否有错误。

#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>
#define TRYTO(b,a) if (!(a)) { \
fprintf(stderr,"Unable to " b "\n"); exit(1);}
static BOOL CALLBACK FunkyCallback(HWND hWnd, LPARAM lParam ){
char b[100]; RECT Rect;
DWORD pid;
if(!GetParent(hWnd)){
GetWindowText(hWnd, b, 99); GetWindowRect(hWnd,&Rect);
GetWindowThreadProcessId(hWnd, &pid);
printf("%li: %s left:%li top:%li\n",pid,b,Rect.left,Rect.top);
}
return TRUE;
}
int main(int argc, char ** argv){
HANDLE hFile;
DWORD procID;
HANDLE hProc;
if (argc > 1){
TRYTO("create file",(
hFile = CreateFile(
"proc.dmp",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
))!=INVALID_HANDLE_VALUE);
DWORD procID = atoi(argv[1]);
TRYTO("open process",(
hProc = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
procID
)));
TRYTO("write dump",(
MiniDumpWriteDump(
hProc,
procID,
hFile,
MiniDumpNormal,
NULL,
NULL,
NULL
)));
fprintf(stderr,"Successfully created proc.dmp.\n",argv[0]);
CloseHandle(hFile);
} else {
EnumChildWindows(GetDesktopWindow(),FunkyCallback, 0);
fprintf(stderr,"Usage: %s procID\n",argv[0]);
}
}

编译笔记

在 Linux 上测试 Mingw64 . Fedora Linux has packages here .我将 64 位 dbghelp.dll 从 Windows Server 2008 Windows/system32 复制到源文件夹。 objdump -f 可以确认dll是64位还是32位的。编译行类似于

/usr/bin/x86_64-w64-mingw32-gcc dmp.c -L. -l dbghelp -o dmp.exe

链接

关于c - MiniDumpWriteDump 段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com