gpt4 book ai didi

c++ - 是否可以在不崩溃的情况下以编程方式创建迷你转储文件?

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:29 25 4
gpt4 key购买 nike

假设远程站点出现罕见错误,但不会使应用程序崩溃。发生这种情况时,我仍然想创建一个小型转储文件,这样我就有了一些信息可以使用,主要是调用堆栈。

伪代码如下:

try
{
doStuff();
}
catch(_com_error &e)
{
make_minidump(); // is this possible?

dump_com_error(e);
return FALSE;
}

我看到的所有示例都要求我必须导致应用程序崩溃(至少出于演示目的)以生成转储文件,但我不想这样做。是否可以像这样创建转储文件?

我知道我可以转到任务管理器并创建正在运行的进程的转储文件,同样我可以使用 ProcessExplorer 来实现相同的目的,所以它看起来应该是可能的。

同时在我看到的所有示例中,仅当控件到达SetUnhandledExceptionFilter时才会生成转储文件。当应用程序崩溃时调用!

作为最后的手段,生成转储文件的唯一方法是故意使用如下内容使应用程序崩溃:除了崩溃之外,这会产生任何有用的东西吗?因为我知道在这种情况下是什么导致了崩溃。

LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
{
make_minidump(e);
return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
SetUnhandledExceptionFilter(unhandled_handler);

return *(int*)0;
}

最佳答案

是的,当然。类似于 Windows 任务管理器可以毫无异常(exception)地创建正在运行/挂起的应用程序的故障转储,您可以使用 MiniDumpWriteDump()创建故障转储。只需为 ExceptionParam 传递 NULL

下面是一些可能有用的代码:

typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile,
MINIDUMP_TYPE DumpType,
CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

const wchar_t * DBGHELP = L"DbgHelp.dll";

bool Dump(const std::wstring & dumpFile)
{
bool success = false;
DllLoader loader;

// Load dbghelp.dll. Try first to find it in the application directory.
loader.Load(::GetModuleHandle(NULL), DBGHELP);
if (!loader.IsLoaded())
{
loader.Load(DBGHELP);
}

if (loader.IsLoaded())
{
MINIDUMPWRITEDUMP pDump = MINIDUMPWRITEDUMP(loader.GetProcAddress("MiniDumpWriteDump"));

if (pDump)
{
// Create dump file
HANDLE fileHandle = ::CreateFileW(dumpFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, nullptr, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, nullptr);

if (fileHandle != INVALID_HANDLE_VALUE)
{
BOOL bOK = pDump(GetCurrentProcess(), GetCurrentProcessId(), fileHandle, MiniDumpWithFullMemory, nullptr, nullptr, nullptr);
if (bOK)
{
success = true;
}

::CloseHandle(fileHandle);
}
}
}

return success;
}

由于优化,我无法在 k 中看到正确的堆栈,但 dds ebp 显示它:

0029f8d0  01302029 GetCrashWithDLL!MethodB+0x99 [f:\...\getcrashwithdll.cpp @ 12]
[...]
0029f914 0130209c GetCrashWithDLL!wmain+0x3c [f:\...\getcrashwithdll.cpp @ 31]
[...]
0029f920 01302cff GetCrashWithDLL!__tmainCRTStartup+0xfd [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 623]

关于c++ - 是否可以在不崩溃的情况下以编程方式创建迷你转储文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43193901/

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