产品经过漫长的花期,即将结果。面临市场,面对用户,总有很多很多莫名奇妙的问题,让你每天不得不花大量的精力和时间在 bug 上面,我想问题最难的莫过于,问题的随机性,偶尔出现,无法捕捉。放假这几天在网络上逛了一圈,有些收获,也有惊喜,有些无法消化,便于以后记忆,按照鲁迅先生的拿来主义,拿来再说,大杂烩的笔记,以后有机会再作整理,文字大部分来自网络,感谢广大网友们的分享,感谢你们的无私。
1.正确的使用方法:
将崩溃程序的dmp, pdb,exe文件都放在同一个目录下,然后双击运行dmp,(或者用VS打开),然后就会出现一个名为dumpfile的解决方案并且包含一个dumpfile的工程,此时右键点击此工程,选择调试->启动新实例(或者启动并进入单步调试新实例)都行,此时程序会自动的调到源码中崩溃的那一行,并且在call stack中有完整的堆栈信息,并且临时变量的值也可以通过VS显示出来,还有模块信息,线程信息
http://blog.youkuaiyun.com/vagrxie/archive/2009/07/31/4398721.aspx
C++ Core dump问题定位方法
http://wenku.baidu.com/view/3b49ffdba58da0116c174962.html
2. WinDbg下载:
Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
3. 生成 dump 的源码。
- #include <stdio.h>
- #include <windows.h>
- #include <dbghelp.h>
- #pragma comment(lib, "Dbghelp.lib")
- LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
- {
- LONG ret = EXCEPTION_EXECUTE_HANDLER;
- TCHAR szFileName[64];
- SYSTEMTIME st;
- ::GetLocalTime(&st);
- wsprintf(szFileName, TEXT("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);
- HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
- if (hFile != INVALID_HANDLE_VALUE)
- {
- MINIDUMP_EXCEPTION_INFORMATION ExInfo;
- ExInfo.ThreadId = ::GetCurrentThreadId();
- ExInfo.ExceptionPointers = lpExceptionInfo;
- ExInfo.ClientPointers = false;
- // write the dump
- BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL ); if (bOK)
- {
- printf("Create Dump File Success!/n");
- }
- else
- {
- printf("MiniDumpWriteDump Failed: %d/n", GetLastError());
- }
- ::CloseHandle(hFile);
- }
- else
- {
- printf("Create File %s Failed %d/n", szFileName, GetLastError());
- }
- return ret;
- }
#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")
LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
TCHAR szFileName[64];
SYSTEMTIME st;
::GetLocalTime(&st);
wsprintf(szFileName, TEXT("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);
HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = lpExceptionInfo;
ExInfo.ClientPointers = false;
// write the dump
BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL ); if (bOK)
{
printf("Create Dump File Success!/n");
}
else
{
printf("MiniDumpWriteDump Failed: %d/n", GetLastError());
}
::CloseHandle(hFile);
}
else
{
printf("Create File %s Failed %d/n", szFileName, GetLastError());
}
return ret;
}
4.调用
- int main()
- {
- ::SetUnhandledExceptionFilter(MyUnhandledFilter);
- int *p;*p = 100;
- return 0;
- }
int main()
{
::SetUnhandledExceptionFilter(MyUnhandledFilter);
int *p;*p = 100;
return 0;
}
5.调试dump文件
把dmp文件和exe, pdb文件放在同一目录下, 然后用编译器(如vc)打开, 然后开始调试就会中断到刚才中断的地方.
6. 使用windbg分析dmp文件定位程序bug
http://www.cppblog.com/woaidongmao/archive/2011/05/11/146206.html
7. VC6 Release下,产生 MiniDump的编译设置
http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html
8.利用VS2005进行dump文件调试
http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html
后记:csdn 发个博文真不容易,文字的排版让人纠结,期望越做越好。