1、VS项目产生pdb文件:
项目属性--》连接器--》调试--》生成调试信息 修改成 是;
2、管理好pdb与产品程序exe的对应关系;
PS:我是通过SVN来管理的,每次上传项目文件时,同时上传相应的pdb文件;
3、在项目开始位置添加 产生dump的代码;
我采用的是minidump生成项目的dump;
mini_dump 实现:
#ifndef __WIN32_DEBUG_EXCEPT_MINIDUMP_HPP
#define __WIN32_DEBUG_EXCEPT_MINIDUMP_HPP
#include <Windows.h>
#include <DbgHelp.h>
#include <Shlwapi.h>
#pragma comment(lib, "dbghelp.lib")
#pragma comment(lib, "shlwapi.lib")
namespace win32
{
namespace debug
{
// -----------------------------------------------
// class MiniDump
class mini_dump
{
public:
mini_dump()
{
::SetUnhandledExceptionFilter(filter);
}
private:
static void dump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
if (excpInfo == NULL)
{
__try
{
::RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
}
__except(dump(hFile, GetExceptionInformation()),
EXCEPTION_CONTINUE_EXECUTION)
{}}
else
{
MINIDUMP_EXCEPTION_INFORMATION eInfo;
eInfo.ThreadId = ::GetCurrentThreadId();
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE;
::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(),
hFile, MiniDumpNormal, excpInfo ? &eInfo : NULL, NULL, NULL);
}
}
static LONG WINAPI filter(PEXCEPTION_POINTERS pExcept)
{
TCHAR szDir[MAX_PATH] = {0};
TCHAR szExe[MAX_PATH] = {0};
::GetModuleFileName(NULL, szDir, _countof(szDir));
LPTSTR pFile = ::PathFindFileName(szDir);
LPTSTR pExt = ::PathFindExtension(szDir);
if (pFile != szDir && pExt != NULL)
{
*pExt = 0;
lstrcpy(szExe, pFile);
}
else
{
lstrcpy(szExe, TEXT("Crash"));
}
::PathRemoveFileSpec(szDir);
::PathAddBackslash(szDir);
lstrcat(szDir, TEXT("Dump\\"));
::CreateDirectory(szDir, NULL);
SYSTEMTIME st = {0};
::GetLocalTime(&st);
TCHAR szModuleName[MAX_PATH] = {0};
wsprintf(szModuleName, TEXT("%s%s-%04d%02d%02d%02d%02d%02d.dmp"), szDir, szExe,
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
HANDLE hFile = ::CreateFile(szModuleName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
dump(hFile, pExcept);
::CloseHandle(hFile);
}
return 0;
}
};
}
}
#endif
4、windbg 调试:
4.1、windbg 版本:
4.2、设置符号文件:file-->Synbol file path
4.3、将pdb文件的目录路径拷贝进去:
PS:如果需要微软的pdb:在symbol path里设置成:
SRV*D:\dmp*http://msdl.microsoft.com/download/symbols
4.4、将dmp文件拖入windbg;
4.5、在命令行输入框,输入:!analyze -v;
查看分析出的堆栈信息: