是否可以以编程方式创建迷你转储文件而不会崩溃?
Is it possible to create mini dump file programmatically without a crash?
>假设远程站点收到罕见的错误,但不会使应用程序崩溃。发生这种情况时,我仍然想创建一个迷你转储文件,所以我有一些信息可以使用,主要是调用堆栈。
伪代码如下:
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任务管理器可以创建正在运行/挂起的应用程序的故障转储而没有任何异常,您可以使用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:ddvctoolscrtcrtw32dllstuffcrtexe.c @ 623]
相关文章:
- Visual Studio在尝试读取resource.txt文件时崩溃
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 为什么从文件获取图标时应用程序有时会崩溃?
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 当我运行MEX文件时,MATLAB崩溃
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 如何从核心转储文件中识别导致崩溃的完整命令
- 简单的文本文件格式化在linux下崩溃,但在Windows中很好
- 用静态版本的QT编译时,文件对话框崩溃
- MEX文件实现特征库伪内函数崩溃
- 循环导致文件崩溃
- 二进制树:从文件崩溃中读取
- C++可执行文件崩溃
- 为什么我的.exe文件崩溃了,但在调试和发布版本中工作得很好
- CMake :运行 ctest 时可执行文件崩溃
- c++增强序列化如何防止不正确的文件崩溃
- 编译后的应用程序可执行文件崩溃,除非重命名.为什么
- mex文件崩溃,如何在MATLAB中使用MATLAB_MEM_MGR