windbg 接合pdb文件分析dmp文件

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;

查看分析出的堆栈信息:

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值