Nav*_*een 11 c++ debugging winapi windbg
每当从我的代码生成结构化异常时,我使用以下代码创建一个minidump文件:
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;
}
Run Code Online (Sandbox Code Playgroud)
我正在SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);从我的应用程序的主要入口点开始(虽然我没有为每个线程设置它).在此之后测试此代码我执行以下操作以生成访问冲突:int* p = 0; *p = 0;转储文件确实生成了.然后我使用windbg打开转储文件并使用.ecxr命令获取异常记录.但是,没有信息(即我没有得到调用堆栈).此外,如果我使用!analyze -v命令,那么它能够显示发生崩溃的行.有人知道我错过了什么以及如何解决这个问题?
顺便说一句,我使用VC7编译器和/ EHa(异步模型异常模型)标志.
您创建小型转储的代码没问题,问题是事后调试。调试器必须有权访问程序源代码、.pdb 文件(应该是构建此程序可执行文件时创建的 pdb 文件)和操作系统调试符号。只有拥有所有这些信息,调试器才能显示源代码和调用堆栈中的异常位置。
使用 Visual Studio 调试器的事后调试过程详细描述如下:http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx对于 WinDbg,使用符号、源和图像文件路径为调试器提供相同的信息。
| 归档时间: |
|
| 查看次数: |
7467 次 |
| 最近记录: |