如何像QQ一样在自己崩溃的时候捕捉下来,比较体面的显示出来错误信息?

progray 2004-07-27 01:03:36
QQ爱崩溃,本来我想用“烂”字来评价的,但人家虽然崩溃了,还弄个很好看的提示窗口,所以我觉得QQ还不错哦。
我是Delphi版的,但我觉得CB版的高手更多一些。而且,我知道Delphi提供了Application.OnException事件,不知道这个到底能不能捕捉到类似地址错误的一类致命错误,即使能,我还想知道具体是如何实现的,所以我希望能把这个功能实现原理搞清楚,我想CB版的朋友可能更擅长一些。
恳请各位帮忙,最好用SDK的代码来讲解一下,多谢!
...全文
1930 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
zihan 2004-08-06
  • 打赏
  • 举报
回复
是啊,myy,厉害,我就最怕篮屏了,因为基本上蓝屏都要我重新安装系统.

搂住贴的那个应该是导出的堆栈信息以及模块信息,这个应该很容易导出来的.
jiangchun_xn 2004-08-05
  • 打赏
  • 举报
回复
Win2000蓝屏!
----------
厉害阿,我感觉有些难度呢。
NullUser 2004-08-05
  • 打赏
  • 举报
回复
try catch就是seh(异常处理),程序崩溃时转到seh例程去处理,你可以通过context来取得出错时的寄存器信息,找到原因,进行处理。

BCB作的比较好了,编译时,编译器帮你作了这些后台工作,所以BCB程序错误时通常是体面的死去。。。

myy 2004-08-05
  • 打赏
  • 举报
回复
我觉得,有些错误程序自己是拦不到,前一阵子我写个com程序
(很常规的,用URL Moniker做http下载),不小心有个除零(没加try catch),
居然让Win2000蓝屏!而且是屡试屡灵,真搞不懂....
progray 2004-08-05
  • 打赏
  • 举报
回复
我发现我看不懂你们在说什么了,下面是QQ崩溃时的记录 :


Microsoft Windows 2000 Service Pack 4 [Build 5.0.2195]

QQ 12.13.7029 9BCC76126DF2DAFC7EBBD0E77436B
-----------------------------------
Type: EXCEPTION_ACCESS_VIOLATION
Address: 0x6BC61694
Error: Read address 0x00000000

Call stack:
0x6BC40000[21694] MFC42.DLL: Ordinal3924(0,104780460,1237072,1808143896)
0x6BC40000[21632] MFC42.DLL: Ordinal6623(2952400,3196668,1342177280,1237056)
0x6BC40000[21618] MFC42.DLL: Ordinal2135(2952400,3196668,1342177280,1237128)
0x00230000[40C7F] QQBaseClassInDll.dll: CQQHtmlBrowseDlg::~CQQHtmlBrowseDlg(1237648,104780224,104780224,1265648)
0x6BC40000[1F1B] MFC42.DLL: Ordinal5163(1,0,2952136,1237312)
0x6BC40000[1CEA] MFC42.DLL: Ordinal6374(1,0,1237648,0)
0x6BC40000[1C73] MFC42.DLL: Ordinal1109(0,2556944,1,0)
0x6BC40000[1BFB] MFC42.DLL: Ordinal1578(2556944,1,0,1237648)
0x05D50000[87B4] QQSysMsgMng.dll: (2556944,1,0,1237648)
0x77DF0000[1EF0] USER32.DLL: MsgWaitForMultipleObjects(97879942,2556944,1,0)
0x77DF0000[3869] USER32.DLL: SetWindowTextW(7964536,1,0,1237648)
0x77DF0000[4947] USER32.DLL: SetWindowLongW(1237608,104,104,3)
0x77F80000[1FF57] ntdll.dll: KiUserCallbackDispatcher(41353216,6,32,65546)
0x77DF0000[17677] USER32.DLL: CreateDialogIndirectParamAorW(41353216,43779976,65546,1808043637)
0x77DF0000[1477A] USER32.DLL: CreateDialogIndirectParamA(41353216,43779976,65546,1808043637)
0x6BC40000[A1A1] MFC42.DLL: Ordinal2147(43779976,104846924,41353216,104780224)
0x6BC40000[A35E] MFC42.DLL: Ordinal2168(104775824,104780224,3327638,24816808)
0x05D50000[6075] QQSysMsgMng.dll: CQQHtmlBrowseDlg::`default constructor closure'(64810852,3,24816808,0)
0x05D50000[5CDC] QQSysMsgMng.dll: CQQHtmlBrowseDlg::`default constructor closure'(24816808,1,1,107889396)
0x05D50000[5B60] QQSysMsgMng.dll: CQQHtmlBrowseDlg::`default constructor closure'(64670784,100401096,1265648,1239828)
0x05D50000[6E44] QQSysMsgMng.dll: CQQHtmlBrowseDlg::`default constructor closure'(24816840,24816840,1239868,100354176)


Modules:
-----------------------------------
[ 0x00230000 ] F:\工具\qq工具\2004去ip版本\QQBaseClassInDll.dll
[ 0x00320000 ] F:\工具\qq工具\2004去ip版本\QQHelperDll.dll
[ 0x00360000 ] F:\工具\qq工具\2004去ip版本\QQZip.dll
[ 0x00400000 ] F:\工具\qq工具\2004去ip版本\QQ.exe
[ 0x00C10000 ] H:\WINNT\system32\DrvTrNTl.dll
[ 0x00E40000 ] H:\杀毒软件\金山毒霸\KMailFun.dll
[ 0x01B10000 ] H:\WINNT\system32\msi.dll
[ 0x02010000 ] F:\工具\qq工具\2004去ip版本\QQAPI.dll
[ 0x02130000 ] F:\工具\qq工具\2004去ip版本\ImagePro.dll
[ 0x02140000 ] F:\工具\qq工具\2004去ip版本\InPlus.dll
[ 0x02210000 ] D:\Program Files\Tencent\QQ\TIMProxy.dll
[ 0x02230000 ] F:\工具\qq工具\2004去ip版本\LoginCtrl.dll
[ 0x02770000 ] F:\工具\qq工具\2004去ip版本\QQRes.dll
[ 0x05D50000 ] F:\工具\qq工具\2004去ip版本\QQSysMsgMng.dll
[ 0x05D70000 ] F:\工具\qq工具\2004去ip版本\LongConnection.dll
[ 0x05DB0000 ] F:\工具\qq工具\2004去ip版本\QQConfigPlugin.dll
[ 0x05DC0000 ] F:\工具\qq工具\2004去ip版本\CameraDll.dll
[ 0x05DF0000 ] F:\工具\qq工具\2004去ip版本\QQAllInOne.dll
[ 0x05EC0000 ] F:\工具\qq工具\2004去ip版本\QQGroupMng.dll
[ 0x05EF0000 ] F:\工具\qq工具\2004去ip版本\GroupConnection.dll
[ 0x05F10000 ] F:\工具\qq工具\2004去ip版本\CQQApplication.dll
[ 0x05FA0000 ] F:\工具\qq工具\2004去ip版本\QQMainFrame.dll
[ 0x05FF0000 ] F:\工具\qq工具\2004去ip版本\NewSkin.dll
[ 0x06030000 ] F:\工具\qq工具\2004去ip版本\PersonalDesktop.dll
[ 0x06140000 ] F:\工具\qq工具\2004去ip版本\QQPlugin.dll
[ 0x07030000 ] F:\工具\qq工具\2004去ip版本\OEMApplication.dll
[ 0x074F0000 ] F:\工具\qq工具\2004去ip版本\BQQApplication.dll
[ 0x07520000 ] F:\工具\qq工具\2004去ip版本\ContentTab.dll
[ 0x07790000 ] F:\工具\qq工具\2004去ip版本\QQAvatar.dll
[ 0x07AD0000 ] F:\工具\qq工具\2004去ip版本\QRingMng.dll
[ 0x07AE0000 ] F:\工具\qq工具\2004去ip版本\videodevice.dll
[ 0x07B00000 ] F:\工具\qq工具\2004去ip版本\QQSceneMng.dll
[ 0x07B20000 ] F:\工具\qq工具\2004去ip版本\QQHook.dll
[ 0x07B40000 ] H:\WINNT\system32\msdmo.dll
[ 0x07B60000 ] F:\工具\qq工具\2004去ip版本\QQUdpGetFileLib.dll
[ 0x10000000 ] F:\工具\qq工具\2004去ip版本\BasicCtrlDll.dll
[ 0x35680000 ] H:\WINNT\system32\devenum.dll
[ 0x37210000 ] H:\WINNT\DOWNLO~1\CnsMin.dll
[ 0x60A20000 ] H:\WINNT\system32\PNCRT.dll
[ 0x63000000 ] H:\Program Files\Real\RealOne Player\rpplugins\rpms3260.dll
[ 0x65D20000 ] H:\WINNT\system32\USP10.dll
[ 0x65E10000 ] H:\WINNT\system32\umdmxfrm.dll
[ 0x678B0000 ] H:\WINNT\system32\serwvdrv.dll
[ 0x68E90000 ] H:\WINNT\system32\OLEPRO32.DLL
[ 0x6A1A0000 ] H:\WINNT\system32\MSVFW32.dll
[ 0x6B600000 ] F:\工具\qq工具\2004去ip版本\vbscript.dll
[ 0x6BC00000 ] H:\WINNT\system32\DrvTrNTm.dll
[ 0x6BC20000 ] H:\WINNT\system32\MFC42LOC.DLL
[ 0x6BC40000 ] F:\工具\qq工具\2004去ip版本\MFC42.DLL
[ 0x6C330000 ] H:\WINNT\system32\LPK.DLL
[ 0x6D990000 ] H:\WINNT\system32\SETUPAPI.DLL
[ 0x6DD30000 ] H:\WINNT\system32\INDICDLL.dll
[ 0x70200000 ] H:\WINNT\system32\WININET.dll
[ 0x702B0000 ] H:\WINNT\system32\urlmon.dll
[ 0x70BD0000 ] H:\WINNT\system32\SHLWAPI.DLL
[ 0x71000000 ] H:\WINNT\system32\shdocvw.dll
[ 0x71710000 ] H:\WINNT\system32\COMCTL32.DLL
[ 0x72960000 ] H:\WINNT\system32\DBGHELP.dll
[ 0x72C50000 ] H:\WINNT\system32\CLBCATQ.DLL
[ 0x74810000 ] H:\WINNT\system32\AVICAP32.dll
[ 0x74B80000 ] F:\工具\qq工具\2004去ip版本\RICHED20.dll
[ 0x74F50000 ] H:\WINNT\system32\msafd.dll
[ 0x74F90000 ] H:\WINNT\System32\wshtcpip.dll
[ 0x74FA0000 ] H:\WINNT\system32\WS2HELP.DLL
[ 0x74FB0000 ] H:\WINNT\system32\WS2_32.DLL
[ 0x74FD0000 ] H:\WINNT\system32\WSOCK32.dll
[ 0x750E0000 ] H:\WINNT\system32\SAMLIB.DLL
[ 0x75100000 ] H:\WINNT\system32\NETAPI32.DLL
[ 0x75150000 ] H:\WINNT\system32\NETRAP.DLL
[ 0x75950000 ] H:\WINNT\system32\LZ32.DLL
[ 0x75A50000 ] H:\WINNT\system32\sensapi.dll
[ 0x75E00000 ] H:\WINNT\system32\IMM32.DLL
[ 0x76AC0000 ] F:\工具\qq工具\2004去ip版本\RICHED32.DLL
[ 0x772E0000 ] H:\WINNT\system32\MPRAPI.DLL
[ 0x77300000 ] H:\WINNT\system32\iphlpapi.dll
[ 0x77320000 ] H:\WINNT\system32\DHCPCSVC.DLL
[ 0x77340000 ] H:\WINNT\system32\ADSLDPC.DLL
[ 0x77370000 ] H:\WINNT\system32\ACTIVEDS.DLL
[ 0x773A0000 ] H:\WINNT\system32\ATL.DLL
[ 0x773C0000 ] H:\WINNT\system32\msacm32.drv
[ 0x773D0000 ] H:\WINNT\system32\MSACM32.dll
[ 0x773F0000 ] H:\WINNT\system32\MSASN1.DLL
[ 0x77480000 ] H:\WINNT\system32\RASMAN.DLL
[ 0x774A0000 ] H:\WINNT\system32\RASAPI32.DLL
[ 0x774E0000 ] H:\WINNT\system32\ICMP.DLL
[ 0x774F0000 ] H:\WINNT\system32\TAPI32.DLL
[ 0x77520000 ] H:\WINNT\system32\wdmaud.drv
[ 0x77530000 ] H:\WINNT\system32\WINMM.dll
[ 0x777A0000 ] H:\WINNT\System32\winrnr.dll
[ 0x777B0000 ] H:\WINNT\system32\rasadhlp.dll
[ 0x777E0000 ] H:\WINNT\system32\VERSION.dll
[ 0x777F0000 ] H:\WINNT\system32\RTUTILS.DLL
[ 0x77800000 ] H:\WINNT\System32\rnr20.dll
[ 0x77900000 ] H:\WINNT\system32\IMAGEHLP.dll
[ 0x77930000 ] H:\WINNT\system32\WLDAP32.DLL
[ 0x77960000 ] H:\WINNT\system32\DNSAPI.DLL
[ 0x77990000 ] H:\WINNT\system32\OLEAUT32.dll
[ 0x77A30000 ] H:\WINNT\system32\ole32.dll
[ 0x77DF0000 ] H:\WINNT\system32\USER32.DLL
[ 0x77E60000 ] H:\WINNT\system32\KERNEL32.dll
[ 0x77F40000 ] H:\WINNT\system32\GDI32.dll
[ 0x77F80000 ] H:\WINNT\system32\ntdll.dll
[ 0x78000000 ] H:\WINNT\system32\MSVCRT.dll
[ 0x780C0000 ] F:\工具\qq工具\2004去ip版本\MSVCP60.dll
[ 0x786F0000 ] H:\WINNT\system32\RPCRT4.DLL
[ 0x78F90000 ] H:\WINNT\system32\SHELL32.dll
[ 0x794D0000 ] H:\WINNT\system32\USERENV.DLL
[ 0x796D0000 ] H:\WINNT\system32\ADVAPI32.dll
[ 0x797B0000 ] H:\WINNT\systAem32\SECUR32.DLL
[ 0x79C40000 ] H:\WINNT\system32\CRYPT32.dll
___________________________________
我的水平看来一时还难以消化这些,更不用提用程序实现。我还是努力学习学习吧,欢迎继续讨论,感谢各位高手前来讨论。
befree 2004-08-05
  • 打赏
  • 举报
回复
XP的这个新东东很耗内存,也慢。
zihan 2004-08-05
  • 打赏
  • 举报
回复
在Xp下,Microsoft又提供了又一种异常处理,那就是VEH(Vectored Exception Handling),我译作向量异常处理,这个东东用如下api注册,类似于SEH,也是一个链状结构,让我们来看看他的不同之处,噫,好像差不多啊:
WINBASEAPI PVOID WINAPI AddVectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler );

FirstHandler:是一个标志,可以指定是否将你的VEH处理例程放在VEH链的最前面!
VectoredHandler:这个东东是异常处理例程入口
LONG NTAPI VectoredExceptionHandler(PEXCEPTION_POINTERS);
PEXCEPTION_POINTERS是指向EXCEPTION_POINTERS的指针,具体EXCEPTION_POINTERS的结构是否和SEH的一致?估计是一致的,我装了Xp,没有下DDk呢,现在正在找!
正像你看到的,好像和Final型SEH处理差不多?不一样!区别如下:
1)首先是AddVectoredExceptionHandler添加的异常处理句柄可以嵌套,而不是只能指定一个
2)其次是AddVectoredExceptionHandler可以指定你的异常处理句柄是否在链的最前面,hoho,这可是我们期望的!当然如果在你后面有人调用AddVectoredExceptionHandler也作同样指定,那对不起,你只得在他后面了.

XP仍然支持SEH,那么问题来了SEH和VEH是什么关系,答案很简单,VEH优先权高于SEH,只有所有VEH全不处理某个异常的时候,异常处理权才会到达SEH.只要目标程序中没有利用VEH,你的VEH就是第一个得到控制者.哈哈,现在的采用SEH作为异常处理的普通C/C++程序对你不会再有干扰了!你可以用VEH来hook api了,god!
zihan 2004-08-05
  • 打赏
  • 举报
回复
这篇文章也讲的可以.

http://member.netease.com/~qinj/gpgame/docs/program/seh.htm
zihan 2004-08-05
  • 打赏
  • 举报
回复
同意上面的,其实所谓的try和catch代码,在编译的时候已经被编译为了seh的代码了.可以从汇编代码里面看到,然后在catch里面进行跳转,那张跳转表就是记录了异常的处理方法.
jiangchun_xn 2004-08-05
  • 打赏
  • 举报
回复
这样看来,还是操作系统的异常为最后的“异常”,也就是所有c++异常最终都是形成操作系统的SEH_...,throw就是RaiseException。
jiangchun_xn 2004-08-05
  • 打赏
  • 举报
回复
,MicrosoftVisualC++编译器已经利用操作系统的结构化异常处理实现了C++异常处理。所以当你建立一个C++try块时,编译器就生成一个SEH__try块。一个C++catch测试变成一个SEH异常过滤器,并且catch中的代码变成SEH__except块中的代码。实际上,当你写一条C++throw语句时,编译器就生成一个对Windows的RaiseException函数的调用。用于throw语句的变量传递给RaiseException作为附加的参数。
-------------------------------------
WINDOWS核心编程_笔记_25章未处理异常和C++异常  作者 长河落日
jiangchun_xn 2004-08-05
  • 打赏
  • 举报
回复
to NullUser

请问你是如何知道try也是seh异常处理的,我从bcb/vc反编译产生的asm来看,没有发现他调用了任何seh的函数,vc和bcb产生的asm都是生成了一张跳转表,然后来在throw的时候带跳转到那张表的的地址


请指教?
-----------
我觉得应该是捕捉了seh之后,再重新throw成c++的异常。
Siney 2004-08-05
  • 打赏
  • 举报
回复
to NullUser

请问你是如何知道try也是seh异常处理的,我从bcb/vc反编译产生的asm来看,没有发现他调用了任何seh的函数,vc和bcb产生的asm都是生成了一张跳转表,然后来在throw的时候带跳转到那张表的的地址


请指教?
progray 2004-08-04
  • 打赏
  • 举报
回复
很感谢Aweay(绝食高手) ,可惜我不会C,没办法把你最后面的代码在VC里编译通过,于是想依样在Delphi里搞一个。
但我怎么在Delphi里失败了,代码如下
function CatchAV(EXCEPTION_POINTERS: TPoint): integer;stdcall;
begin
MessageBox(0,'error','error',mb_ok);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
TestArr:array[0..2] of integer;
i:integer;
begin
SetUnhandledExceptionFilter(@CatchAV);
for i := 0 to 3 do
TestArr[i] := i;
{ 我不懂汇编,所以还是自己制造了一个异常
asm
int 3
end;
}
end;

系统照旧报错,根本没理会我的处理。这是怎么回事呢?
Siney 2004-08-04
  • 打赏
  • 举报
回复
那是因为被delphi自己的异常处理程序截获了(就像我的bcb),你可以使用TApplicationEvent的OnExecption事件处理这个错误,上面的程序处理的异常是OnExecption不能处理的异常会调用上面的代码的处理方法.
jeep008 2004-08-04
  • 打赏
  • 举报
回复
向高手学习```
BuildError 2004-08-04
  • 打赏
  • 举报
回复
多了解一点儿……
jiangchun_xn 2004-08-04
  • 打赏
  • 举报
回复
系统照旧报错
---
是不是被delphi自己截获了
Siney 2004-08-03
  • 打赏
  • 举报
回复
^_^,找到了,你有救了:


When a program crashes (for example, after an access violation), the system automatically invokes a debugger that is specified in the registry for postmortem debugging. To set a debugger as the postmortem debugger, use Regedt32.exe to edit the following registry key:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Add or edit the Debugger value. If you want the debugger to be invoked without a popup, add or edit the Auto value. Give it the string value 1. If Auto is zero, a popup will be displayed before the debugger is invoked.

To install Dr. Watson as the postmortem debugger, use the following command:

drwtsn32 -i
You can also install Dr. Watson for just-in-time (JIT) debugging; Dr. Watson attaches itself to the application and generates a crash dump file. After it creates the crash dump file, Dr. Watson closes the application and exits. To install Dr. Watson as the JIT debugger, use the following command:

drwtsn32 -p %ld -e %ld -g
For more information, see the documentation included with Dr. Watson.

Siney 2004-08-03
  • 打赏
  • 举报
回复
另外好想记得windows会自动给那些crash的程序一次处理结束的机会,就像它自己那样“是否要发送crash信息”,但我一时想不起来如何做了?你可以去微软的tips上看看
加载更多回复(33)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧