gpt4 book ai didi

c++ - 使用 SetUnhandledExceptionFilter() 为访问冲突异常创建小型转储

转载 作者:可可西里 更新时间:2023-11-01 15:23:48 26 4
gpt4 key购买 nike

每当我的代码生成结构化异常时,我都会使用以下代码创建一个小型转储文件:

void CreateMiniDump( EXCEPTION_POINTERS* pep ) 
{
// Open the file
typedef BOOL (*PDUMPFN)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);


HANDLE hFile = CreateFile( _T("C:/temp/MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

HMODULE h = ::LoadLibrary(L"DbgHelp.dll");
PDUMPFN pFn = (PDUMPFN)GetProcAddress(h, "MiniDumpWriteDump");

if( ( hFile != NULL ) && ( hFile != INVALID_HANDLE_VALUE ) )
{
// Create the minidump

MINIDUMP_EXCEPTION_INFORMATION mdei;

mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = TRUE;

MINIDUMP_TYPE mdt = MiniDumpNormal;

BOOL rv = (*pFn)( GetCurrentProcess(), GetCurrentProcessId(),
hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0 );



// Close the file

CloseHandle( hFile );

}

}

LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CreateMiniDump(ExceptionInfo);
return EXCEPTION_EXECUTE_HANDLER;
}

我正在从我的应用程序的主入口点执行 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);(虽然我没有为每个线程设置它)。之后为了测试这段代码,我执行了以下操作以生成访问冲突:int* p = 0; *p = 0; 确实生成了转储文件。然后我使用 windbg 打开转储文件并使用 .ecxr 命令获取异常记录。但是,那里没有任何信息(即我没有收到调用堆栈)。此外,如果我使用 !analyze -v 命令,那么它能够显示发生崩溃的行。有人知道我缺少什么以及如何解决这个问题吗?

顺便说一句,我正在使用带有/EHa(异步异常模型)标志的 VC7 编译器。

最佳答案

您的代码创建 minidump 没问题,问题是事后调试。调试器必须有权访问程序源代码、.pdb 文件(应该是构建此程序可执行文件时创建的 pdb 文件)和操作系统调试符号。只有拥有所有这些信息,调试器才能显示源代码和调用堆栈中的异常位置。

此处详细描述了使用 Visual Studio 调试器的事后调试过程:http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx对于 WinDbg,使用 Symbol、Source 和 Image 文件路径为调试器提供相同的信息。

关于c++ - 使用 SetUnhandledExceptionFilter() 为访问冲突异常创建小型转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4849530/

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