- 浏览: 267269 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
异常处理与MiniDump详解(4) MiniDump
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
讨论新闻组及文件
一、 综述
总算讲到MiniDump了。
Dump有多有用我都无法尽数,基本上属于定位错误修复BUG的倚天剑。(日志可以算是屠龙刀)这些都是对于那些不是必出的BUG,放在外面运行的时候出现的BUG而言的,那些能够通过简单调试就能发现的BUG,一般都不足为惧。
二、 基本应用
MiniDump之所以叫MiniDump,自然是有其Mini之处。。。(废话),呵呵,MS提供了一个API函数,MiniDumpWriteDump,(在Dbghelp.h中声明,需要导入DbgHelp.lib使用)所以我才将其称为MiniDump,其实Dump也能表达同样的意思。。。。
MiniDump最简单的应用在于程序崩溃的时候,将崩溃时那一刻的信息写进一个文件,以方便以后查找错误。使用方法说简单就简单,说难也难。
1. 怎么感知到程序的崩溃?
Window提供了较为方便的方法去感知到程序的几种崩溃情况。
在《Breakpad在进程中完成dump的流程描述》一文中,我描述了一下Breakpad获取到程序崩溃的方法,事实上,这也是典型的Windows下感知程序崩溃的方法,那篇文章是刚开始工作的时候,完成公司自己的ExceptionHandle库的时候写的工作笔记,现在看起来也还是有一定的参考价值。
Windows下感知程序崩溃(其实就是运行时的严重错误)的方法有3个核心的函数,分别如下:
SetUnhandledExceptionFilter(HandleException)确定出现没有控制的异常发生时调用的函数为HandleException.
_set_invalid_parameter_handler(HandleInvalidParameter)确定出现无效参数调用发生时调用的函数为HandleInvalidParameter.
_set_purecall_handler(HandlePureVirtualCall)确定纯虚函数调用发生时调用的函数为HandlePureVirtualCall.
3个函数的使用方法一致,都是在发生自己关心的(见上面的描述)异常时,调用参数传进来回调函数,Windows会将崩溃信息通过参数传入回调函数,这时候就是进行Dump的绝佳时机。详细的信息可以查阅MSDN,我这里就不复制资料了,那样有copy文档之嫌,这里以SetUnhandledExceptionFilter为例,演示实际与MiniDumpWriteDump配合使用的情况。像这些比较复杂的API,MSDN中连个Example都没有,说实话,当时掌握花了一点时间。
ExceptionExample:
#include <windows.h>
#include <Dbghelp.h>
using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
int *p = NULL;
*p = 0;
}
void Fun()
{
Fun2();
}
int main()
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
Fun();
return 1;
}
API的调用仅仅作为释放,查看下MSDN就知道使用方法了,
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
两句讲一下,第一句是取消掉自动内联效果,这样才能达到更好的演示效果,不然,Fun,Fun2这种简单的函数会被自动内联,那么也就没有堆栈,不好看到实际中Dump的作用。效果与VS2005编译选项的,C/C++->优化->内联函数展开->only _inline一样。
第二句是标志导入DbgHelp库,以使用MiniDumpWriteMiniDump API。与VS2005编译选项的链接器->输入->附加依赖项中添加dbgHelp.lib效果一样。
实际运行程序,(不能在VS中调试运行,不然异常控制权总是会被VS掌握,那么,总是没有办法让MyUnhandledExceptionFilter获得控制权,详细的描述见参考2),可以获得一个名叫DumpFile.dmp的文件,此文件就是我们折腾了半天所谓的dump文件了。其他两个函数与MiniDumpWriteMiniDump的配合使用方式也类似,就不多说了。
2. Dump文件的使用
Dump文件的在Windows下的使用非常简单,但是就是因为太过于简单,所以网上的描述也是非常简单,想起来,那时候折腾出Dump文件时非常兴奋,解决发现拿dump文件没有办法,网上简单的描述用VS打开调试的方法总是没有头绪。。。。呵呵
正确的使用方法是,将崩溃程序的dmp, pdb,exe文件都放在同一个目录下,然后双击运行dmp,(或者用VS打开),然后就会出现一个名为dumpfile的解决方案并且包含一个dumpfile的工程,此时右键点击此工程,选择调试->启动新实例(或者启动并进入单步调试新实例)都行,此时程序会自动的调到源码中崩溃的那一行,并且在call stack中有完整的堆栈信息,并且临时变量的值也可以通过VS显示出来,还有模块信息,线程信息,
在上例中,堆栈信息是:
> Exception.exe!Fun2() 行36 C++
Exception.exe!main() 行50 C++
Exception.exe!__tmainCRTStartup() 行597 + 0x17 字节 C
kernel32.dll!7c817077()
[下面的框架可能不正确和/或缺失,没有为 kernel32.dll 加载符号]
ntdll.dll!7c93005d()
然后,寄存器的值为:
EAX = 00000000 EBX = 00000000 ECX = 0000B623
EDX = 7C92E514 ESI = 00000001 EDI = 00403384
EIP = 00401072 ESP = 0013FF7C EBP = 0013FFC0
EFL = 00010246
在normal模式下,dump文件速度较快,但是没有内存信息,你甚至可以通过调整MiniDumpWriteMiniDump的参数来将运行时的整个内存都dump下来,这些都非常简单,查看一下MSDN MiniDumpWriteMiniDump的信息即可。
有了这些信息,程序的错误定位(C++下一般是空指针的访问比较多)已经是非常明朗的了,再配合日志,一般的错误不难发现。这里顺带说明一下,当运行的程序被改名或者糅合进其他地方后运行,用这样的方式,一开始堆栈信息中是没有完整的信息的,这时候可以在堆栈信息中,用右键菜单中的加载符号,选择合适的文件pdb,这样信息就出来了。。。。。(以前这个问题困扰了我们一天)
三、 高级应用
程序崩溃的问题解决了,问题是,有很多时候,很多程序是不允许随便崩溃的,这样,在程序崩溃后再去发现问题就有些晚了,那么,有没有程序不崩溃时也能发现问题的方法呢?前面描述的SEH就是一种让程序不崩溃的方法,不过在那种方式下,按以前描述的方法,崩溃是不崩溃了,但是实际上,掩盖了很多问题,对于问题的发现有些不利的地方。本文前面描述过了,MiniDump是一种快速发现问题的好方法,但是却没有办法避免程序崩溃,那么终极办法是啥呢?我们的目的既然是程序不崩溃+快速发现问题,那么终极办法自然就是SEH+MiniDump了:)SEH和MiniDump都是Windows的特性,MS也的确提供了结合的方式。见下面的例子,呵呵,别太激动了。。。。这也是我们公司的服务器从内测时一天多次无任何通知,预告,警告的崩溃(总监甚至还曾因为我的问题,半夜3点爬起来解决服务器崩溃问题)到现在服务器基本做到永不崩溃,即便出现问题了也有充足的时间从容的解决,然后在服务器中发通告,告诉文件服务器需要临时维护。。。。呵呵,都依赖于此终极解决方案。。。。。
SEH的用法和特性讲解这里不重复了,见前面的文章。《异常处理与MiniDump详解(3) SEH(Structured Exception Handling)》
要想利用MiniDumpWriteMiniDump,需要获取的是MINIDUMP_EXCEPTION_INFORMATION结构的信息,这个结构中最重要的信息来源于PEXCEPTION_POINTERS的信息,这个信息在上述的例子中是在程序崩溃的时候,由Windows作为参数传入我们设定好的异常处理函数的,现在最主要的问题就是从哪里获取到这个异常信息了,通过MSDN,我们查到了GetExceptionInformation的函数,返回的就是这个信息,见MSDN:
LPEXCEPTION_POINTERS GetExceptionInformation(void);
不过,这里MS给出了一个notice:
The Microsoft C/C++ Optimizing Compiler interprets this function as a keyword, and its use outside the appropriate exception-handling syntax generates a compiler error.
事实上,刚开始我使用的时候,哪个地方都试遍了,果然都是报编译错误。因为此函数使用方式如此奇怪,并且没有example。。。。。最后在绝望中。。。看到了Platform Builder for Microsoft Windows CE 5.0的词函数的说明,里面有个说明,然后我吐血了。。。。
try
{
// try block
}
except (FilterFunction(GetExceptionInformation())
{
// exception handler block
}
原来是这样使用的啊。。。。。。。。。。晕
HandleWithoutCrash例子:
#include <windows.h>
#include <Dbghelp.h>
using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
__try
{
static bool b = false;
if(!b)
{
b = true;
int *p = NULL;
*p = 0;
}
else
{
MessageBox(NULL, _T("Here"), _T(""), MB_OK);
}
}
__except(MyUnhandledExceptionFilter(GetExceptionInformation()))
{
}
}
void Fun()
{
Fun2();
}
int main()
{
Fun();
Fun();
return 1;
}
这里例子中,你可以调试程序了,因为程序不会崩溃,这样VS不会和你抢异常的控制。同时,看到dump文件的同时,也可以看到,程序实际上是继续运行了下去,因为MessageBox还是弹出来了。这。。。就是我们想要的。。。。。
我突然想到一首歌。。。。“I want to nobody but you...I want nobody but you.......”呵呵,目的达到了,惊艳吗?
这里有几个要点,GetExceptionInformation()仅仅只能在__except的MS所谓的Filter中调用,其他地方会报编译错误,其次,返回的值和一般的__except的意义是一样的,要想程序运行,需要返回EXCEPTION_EXECUTE_HANDLER表示异常得到了控制。其他几个值的含义见前篇的SEH。
四、 参考资料
1. MSDN—Visual Studio 2005 附带版,Microsoft
2. Windows用户态程序高效排错,熊力著,电子工业出版社
前面的系列文章:
异常处理与MiniDump详解(3) SEH(Structured Exception Handling)
异常处理与MiniDump详解(2) 智能指针与C++异常
异常处理与MiniDump详解(1) C++异常
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
转: http://blog.csdn.net/vagrxie/article/details/4398721
Application Crash Dump Analysis
http://social.technet.microsoft.com/wiki/contents/articles/8103.application-crash-dump-analysis-windows-7.aspx
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
讨论新闻组及文件
一、 综述
总算讲到MiniDump了。
Dump有多有用我都无法尽数,基本上属于定位错误修复BUG的倚天剑。(日志可以算是屠龙刀)这些都是对于那些不是必出的BUG,放在外面运行的时候出现的BUG而言的,那些能够通过简单调试就能发现的BUG,一般都不足为惧。
二、 基本应用
MiniDump之所以叫MiniDump,自然是有其Mini之处。。。(废话),呵呵,MS提供了一个API函数,MiniDumpWriteDump,(在Dbghelp.h中声明,需要导入DbgHelp.lib使用)所以我才将其称为MiniDump,其实Dump也能表达同样的意思。。。。
MiniDump最简单的应用在于程序崩溃的时候,将崩溃时那一刻的信息写进一个文件,以方便以后查找错误。使用方法说简单就简单,说难也难。
1. 怎么感知到程序的崩溃?
Window提供了较为方便的方法去感知到程序的几种崩溃情况。
在《Breakpad在进程中完成dump的流程描述》一文中,我描述了一下Breakpad获取到程序崩溃的方法,事实上,这也是典型的Windows下感知程序崩溃的方法,那篇文章是刚开始工作的时候,完成公司自己的ExceptionHandle库的时候写的工作笔记,现在看起来也还是有一定的参考价值。
Windows下感知程序崩溃(其实就是运行时的严重错误)的方法有3个核心的函数,分别如下:
SetUnhandledExceptionFilter(HandleException)确定出现没有控制的异常发生时调用的函数为HandleException.
_set_invalid_parameter_handler(HandleInvalidParameter)确定出现无效参数调用发生时调用的函数为HandleInvalidParameter.
_set_purecall_handler(HandlePureVirtualCall)确定纯虚函数调用发生时调用的函数为HandlePureVirtualCall.
3个函数的使用方法一致,都是在发生自己关心的(见上面的描述)异常时,调用参数传进来回调函数,Windows会将崩溃信息通过参数传入回调函数,这时候就是进行Dump的绝佳时机。详细的信息可以查阅MSDN,我这里就不复制资料了,那样有copy文档之嫌,这里以SetUnhandledExceptionFilter为例,演示实际与MiniDumpWriteDump配合使用的情况。像这些比较复杂的API,MSDN中连个Example都没有,说实话,当时掌握花了一点时间。
ExceptionExample:
#include <windows.h>
#include <Dbghelp.h>
using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
int *p = NULL;
*p = 0;
}
void Fun()
{
Fun2();
}
int main()
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
Fun();
return 1;
}
API的调用仅仅作为释放,查看下MSDN就知道使用方法了,
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
两句讲一下,第一句是取消掉自动内联效果,这样才能达到更好的演示效果,不然,Fun,Fun2这种简单的函数会被自动内联,那么也就没有堆栈,不好看到实际中Dump的作用。效果与VS2005编译选项的,C/C++->优化->内联函数展开->only _inline一样。
第二句是标志导入DbgHelp库,以使用MiniDumpWriteMiniDump API。与VS2005编译选项的链接器->输入->附加依赖项中添加dbgHelp.lib效果一样。
实际运行程序,(不能在VS中调试运行,不然异常控制权总是会被VS掌握,那么,总是没有办法让MyUnhandledExceptionFilter获得控制权,详细的描述见参考2),可以获得一个名叫DumpFile.dmp的文件,此文件就是我们折腾了半天所谓的dump文件了。其他两个函数与MiniDumpWriteMiniDump的配合使用方式也类似,就不多说了。
2. Dump文件的使用
Dump文件的在Windows下的使用非常简单,但是就是因为太过于简单,所以网上的描述也是非常简单,想起来,那时候折腾出Dump文件时非常兴奋,解决发现拿dump文件没有办法,网上简单的描述用VS打开调试的方法总是没有头绪。。。。呵呵
正确的使用方法是,将崩溃程序的dmp, pdb,exe文件都放在同一个目录下,然后双击运行dmp,(或者用VS打开),然后就会出现一个名为dumpfile的解决方案并且包含一个dumpfile的工程,此时右键点击此工程,选择调试->启动新实例(或者启动并进入单步调试新实例)都行,此时程序会自动的调到源码中崩溃的那一行,并且在call stack中有完整的堆栈信息,并且临时变量的值也可以通过VS显示出来,还有模块信息,线程信息,
在上例中,堆栈信息是:
> Exception.exe!Fun2() 行36 C++
Exception.exe!main() 行50 C++
Exception.exe!__tmainCRTStartup() 行597 + 0x17 字节 C
kernel32.dll!7c817077()
[下面的框架可能不正确和/或缺失,没有为 kernel32.dll 加载符号]
ntdll.dll!7c93005d()
然后,寄存器的值为:
EAX = 00000000 EBX = 00000000 ECX = 0000B623
EDX = 7C92E514 ESI = 00000001 EDI = 00403384
EIP = 00401072 ESP = 0013FF7C EBP = 0013FFC0
EFL = 00010246
在normal模式下,dump文件速度较快,但是没有内存信息,你甚至可以通过调整MiniDumpWriteMiniDump的参数来将运行时的整个内存都dump下来,这些都非常简单,查看一下MSDN MiniDumpWriteMiniDump的信息即可。
有了这些信息,程序的错误定位(C++下一般是空指针的访问比较多)已经是非常明朗的了,再配合日志,一般的错误不难发现。这里顺带说明一下,当运行的程序被改名或者糅合进其他地方后运行,用这样的方式,一开始堆栈信息中是没有完整的信息的,这时候可以在堆栈信息中,用右键菜单中的加载符号,选择合适的文件pdb,这样信息就出来了。。。。。(以前这个问题困扰了我们一天)
三、 高级应用
程序崩溃的问题解决了,问题是,有很多时候,很多程序是不允许随便崩溃的,这样,在程序崩溃后再去发现问题就有些晚了,那么,有没有程序不崩溃时也能发现问题的方法呢?前面描述的SEH就是一种让程序不崩溃的方法,不过在那种方式下,按以前描述的方法,崩溃是不崩溃了,但是实际上,掩盖了很多问题,对于问题的发现有些不利的地方。本文前面描述过了,MiniDump是一种快速发现问题的好方法,但是却没有办法避免程序崩溃,那么终极办法是啥呢?我们的目的既然是程序不崩溃+快速发现问题,那么终极办法自然就是SEH+MiniDump了:)SEH和MiniDump都是Windows的特性,MS也的确提供了结合的方式。见下面的例子,呵呵,别太激动了。。。。这也是我们公司的服务器从内测时一天多次无任何通知,预告,警告的崩溃(总监甚至还曾因为我的问题,半夜3点爬起来解决服务器崩溃问题)到现在服务器基本做到永不崩溃,即便出现问题了也有充足的时间从容的解决,然后在服务器中发通告,告诉文件服务器需要临时维护。。。。呵呵,都依赖于此终极解决方案。。。。。
SEH的用法和特性讲解这里不重复了,见前面的文章。《异常处理与MiniDump详解(3) SEH(Structured Exception Handling)》
要想利用MiniDumpWriteMiniDump,需要获取的是MINIDUMP_EXCEPTION_INFORMATION结构的信息,这个结构中最重要的信息来源于PEXCEPTION_POINTERS的信息,这个信息在上述的例子中是在程序崩溃的时候,由Windows作为参数传入我们设定好的异常处理函数的,现在最主要的问题就是从哪里获取到这个异常信息了,通过MSDN,我们查到了GetExceptionInformation的函数,返回的就是这个信息,见MSDN:
LPEXCEPTION_POINTERS GetExceptionInformation(void);
不过,这里MS给出了一个notice:
The Microsoft C/C++ Optimizing Compiler interprets this function as a keyword, and its use outside the appropriate exception-handling syntax generates a compiler error.
事实上,刚开始我使用的时候,哪个地方都试遍了,果然都是报编译错误。因为此函数使用方式如此奇怪,并且没有example。。。。。最后在绝望中。。。看到了Platform Builder for Microsoft Windows CE 5.0的词函数的说明,里面有个说明,然后我吐血了。。。。
try
{
// try block
}
except (FilterFunction(GetExceptionInformation())
{
// exception handler block
}
原来是这样使用的啊。。。。。。。。。。晕
HandleWithoutCrash例子:
#include <windows.h>
#include <Dbghelp.h>
using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
__try
{
static bool b = false;
if(!b)
{
b = true;
int *p = NULL;
*p = 0;
}
else
{
MessageBox(NULL, _T("Here"), _T(""), MB_OK);
}
}
__except(MyUnhandledExceptionFilter(GetExceptionInformation()))
{
}
}
void Fun()
{
Fun2();
}
int main()
{
Fun();
Fun();
return 1;
}
这里例子中,你可以调试程序了,因为程序不会崩溃,这样VS不会和你抢异常的控制。同时,看到dump文件的同时,也可以看到,程序实际上是继续运行了下去,因为MessageBox还是弹出来了。这。。。就是我们想要的。。。。。
我突然想到一首歌。。。。“I want to nobody but you...I want nobody but you.......”呵呵,目的达到了,惊艳吗?
这里有几个要点,GetExceptionInformation()仅仅只能在__except的MS所谓的Filter中调用,其他地方会报编译错误,其次,返回的值和一般的__except的意义是一样的,要想程序运行,需要返回EXCEPTION_EXECUTE_HANDLER表示异常得到了控制。其他几个值的含义见前篇的SEH。
四、 参考资料
1. MSDN—Visual Studio 2005 附带版,Microsoft
2. Windows用户态程序高效排错,熊力著,电子工业出版社
前面的系列文章:
异常处理与MiniDump详解(3) SEH(Structured Exception Handling)
异常处理与MiniDump详解(2) 智能指针与C++异常
异常处理与MiniDump详解(1) C++异常
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
转: http://blog.csdn.net/vagrxie/article/details/4398721
Application Crash Dump Analysis
http://social.technet.microsoft.com/wiki/contents/articles/8103.application-crash-dump-analysis-windows-7.aspx
发表评论
-
c++ 读取unicode文档
2015-02-09 16:12 956int ReadOneNameFile(char *fil ... -
http://curl.haxx.se/
2013-06-13 17:41 0http://curl.haxx.se/ -
[转]线程本地存储(Thread Local Storage, TLS)分析与使用
2013-05-03 16:53 802线程本地存储(Thread Local Storage, TL ... -
C/C++获得windows版本
2012-12-01 11:05 1457MSDN上有详细介绍,做个标记: #include & ... -
禁用系统硬错误消息对话框
2012-08-31 19:14 718http://support.microsoft.com/kb ... -
Application Crash Dump Analysis (Windows 7)
2012-08-28 09:39 0Application Crash Dump Analysis ... -
如何成为一个windows程序debug高手
2012-08-18 14:40 0minidump: http://blog.csdn.ne ... -
Boost库编译后命名方式
2012-05-17 10:29 1341Boost官网的《Geting Started ... -
geoIP
2012-05-14 12:38 0http://www.oschina.net/code/sni ... -
vs2010 断点 无法命中
2012-05-07 16:13 1350这种情况不解决办法有 很多。你这个方法我没用过。最简单的方法就 ... -
$err,hr
2012-05-04 20:43 907在Visual C++ 中,可以在监视窗口添加 $err,hr ... -
WINDOWS下线程同步探讨
2012-04-11 15:04 945概述 线程同步可 ... -
undefined reference to 'pthread_create'问题解决
2012-03-30 11:43 0由于是Linux新手,所以现在才开始接触线程编程,照着GUN/ ... -
linux 下 遍历文件夹下的内容
2012-03-29 19:43 0// only works in cpp #ifdef __c ... -
浅谈ReadDirectoryChangesW函数的作用和问题所在
2012-03-23 10:32 4316转自:http://www.cnblogs.com ... -
用 _findfirst 和 _findnext 查找文件,遍历文件夹
2012-03-30 11:39 2014标签: _findfirst _findnext 杂谈 分类: ... -
我的广告
2012-03-19 10:57 0http://www.webweb.com/signup.as ... -
服务器多服务器设置
2012-03-12 18:01 749当服务器功能比较多时,可以抽象出一个代理,将不同的服务 ... -
记录个函数 strstr
2012-03-10 11:30 1032包含文件:string.h 函数名: strstr 函 ... -
boost 序列化
2012-03-09 13:40 2709在用boost 二进制序列化类的时候,需要注意动态调用文件打开 ...
相关推荐
当年刚开始工作的时候,第一个工作就是学习breakpad的源代码,然后了解其原理,为公司写一个ExceptionHandle的库,以处理服务器及客户端的未处理异常(unhandleexception),并打下dump,以便事后分析,当年这个功能在...
**Minidump 工具详解** 在Windows操作系统中,当应用程序遇到问题,如崩溃或无响应时,开发者可以通过一种称为“dump”的技术来捕获和分析程序的状态。Dump文件包含了程序运行时内存中的关键信息,这有助于调试和...
**标题与描述解析** 标题提及的“breakup跨平台的c++ minidump工具”指的是一个用C++编写的开源工具,它具有跨平台的特性,主要用于处理和分析minidump文件。Minidump是一种在操作系统中用于记录进程崩溃时内存状态...
4. 错误恢复:在保存完Dump文件后,XMiniDump可以按照预设的方式处理异常,例如退出程序或尝试恢复执行。 XMiniDump的亮点在于其简洁的API和高效的异常处理机制。它不仅提供了基本的异常捕获功能,还支持自定义扩展...
1. **蓝屏死机(BSOD)分析**:使用Windbg打开minidump文件,通过`!analyze -v`确定导致崩溃的原因。 2. **应用程序崩溃诊断**:通过`!heap -h`检查堆泄漏,`!handle`查找句柄异常。 总结,Windbg作为一款强大的...
- **转换minidump**:生成的minidump文件需要进一步处理才能获得人类可读的堆栈跟踪。Breakpad提供了一个名为`dump_syms`的工具,用于解析符号表并将信息附加到minidump文件。 - **分析minidump**:使用`minidump_...
《Qt结合qbreakpad实现跨平台异常处理详解》 在软件开发中,异常处理是确保程序稳定性和可靠性的重要环节。特别是在多平台环境下,统一且有效的异常处理机制更显得至关重要。本文将详细介绍如何在Qt框架下利用...
- **设置崩溃处理**:在Qt应用中,需要设置崩溃处理函数,以便在程序异常时调用Breakpad生成Minidump。 - **编译和链接**:将Breakpad的静态或动态库添加到Qt项目的编译链接步骤中。 - **符号解析**:为了理解...
**qBreakpad:崩溃报告工具详解** 在软件开发过程中,崩溃是无法避免的问题,尤其是在复杂的系统和多线程环境中。为了有效地调试和修复这些问题,开发者需要详细的崩溃信息。qBreakpad是一个针对Qt应用的崩溃报告...
将这些文件与Breakpad工具结合,运维人员可以定位到程序崩溃的原因,比如内存泄漏、段错误或其他类型的运行时错误。 知识点详解: 1. **Breakpad**:Breakpad是一个开源的崩溃报告系统,由Google开发,支持多种...
在这些系统中,开发者通常会使用类似`objdump`或`addr2line`这样的工具来处理符号信息,这些工具可以与Breakpad的`.dmp`文件配合使用,以获取类似Windows上的功能。 使用Google Breakpad工具的一般流程如下: 1. ...
**蓝屏代码查看工具BlueScreenView详解** 在Windows操作系统中,当系统遇到严重的错误或硬件故障时,可能会出现“蓝屏”(Blue Screen of Death,简称BSOD)现象,这是一种系统崩溃的显示方式。为了帮助用户诊断和...
4. **调试与分析** - 使用Breakpad提供的工具(如`minidump_stackwalk`)对.dmp文件进行符号化,找出导致崩溃的具体代码行。 - 分析堆栈跟踪,识别问题的根源,可能需要结合源代码和日志进行深入调查。 5. **优化...
【Qt使用GoogleBreakpad生成崩溃文件】的知识点详解 在软件开发中,为了提供更好的用户体验和提高产品质量,开发者需要能够捕获并分析程序运行时的崩溃情况。GoogleBreakpad是一款强大的开源工具,它允许开发者在...
### 知识点详解 #### 1. 抓取明文密码的前提条件 - **管理权限获取**:在抓取明文密码之前,攻击者必须已经获得了目标机器的管理权限。这通常涉及到对系统的深入访问控制,使得攻击者能够执行需要较高权限的操作。...
记得在实际应用中,不要像示例那样故意触发崩溃,而是要确保捕获并处理异常情况。 通过这种方式,你可以在 Linux 下使用 qBreakpad 收集应用程序崩溃时的信息,从而提高调试效率,为用户提供更好的支持和服务。在...
### Dump文件作用与生成详解 #### 一、Dump文件概述 **Dump文件**,作为程序崩溃后的重要诊断工具,其存在对于快速定位并解决问题起到了关键性的作用。在本篇文章中,我们将详细介绍Dump文件的含义、生成方法及其...
这通常涉及到编写特定的代码,例如使用`minidump.h`和`minidump.cpp`这样的库文件来实现。 #### 四、Windbg命令详解 Windbg提供了丰富的命令集,分为标准命令、元命令和扩展命令三类: 1. **标准命令**:提供了最...
### Windows设置Full Dump及键盘触发蓝屏详解 #### 一、引言 在日常使用Windows操作系统的过程中,我们可能会遇到各种各样的系统问题,这些问题有时难以复现,导致问题定位困难。为了更好地诊断这类问题,我们可以...