CnPack Forum


 
Subject: 求程序报地址错退出的分析方法
treemon
新警察
Rank: 1



UID 40949
Digest Posts 0
Credits 28
Posts 6
点点分 28
Reading Access 10
Registered 2008-9-16
Status Offline
Post at 2008-9-24 13:31  Profile | Blog | P.M. 
求程序报地址错退出的分析方法

1、Release版本加入调试信息
听朋友介绍VC编的程序Release版本在出现地址错时,通过pdb文件可以定位到代码行,
请问Delphi在编译一个没有调式信息的版本时,出现地址错,如何实现类似上面的功能;我只会查map文件的方法;
2、报错现场保存
我目前是用了JCL能将报错的Call Stack保存下来,
朋友介绍VC中使用StackWalker能生成dmp格式文件,利用该文件可以用VC或WinDbg调试。

请大家介绍一下Delphi中实现类似功能的方法,或其他思路。多谢!
Top
sdsyjh
新警察
Rank: 1



UID 41160
Digest Posts 0
Credits 8
Posts 3
点点分 8
Reading Access 10
Registered 2008-10-28
Status Offline
Post at 2008-10-28 09:01  Profile | Blog | P.M. 
报错时立即打开CPU窗口,就可以看到程序错在哪一行代码。
Top
mentoro
新警察
Rank: 1



UID 41328
Digest Posts 0
Credits 16
Posts 6
点点分 16
Reading Access 10
Registered 2008-11-23
Status Offline
Post at 2008-11-23 11:59  Profile | Blog | P.M. 
我现在也是有这个问题,主程序退出时报错,调用DLL时一释放就引起这样的错误,主要是我们的DLL有一个报表组件,好像不支持DLL
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6814
Posts 3580
点点分 6814
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-11-23 13:04  Profile | Blog | P.M. 
我们一般是带调试信息(或带MAP文件)来编译EXE与DLL,然后用JCL或封装了Jcl的CnDebug来一块编译进去。这样在出异常的时候就能记录下出错的地方,然后根据堆栈与编译信息来找出源码中的行号。CnWizards就是这么用的。
Top
mentoro
新警察
Rank: 1



UID 41328
Digest Posts 0
Credits 16
Posts 6
点点分 16
Reading Access 10
Registered 2008-11-23
Status Offline
Post at 2008-11-24 09:47  Profile | Blog | P.M. 
能否具体一点
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6814
Posts 3580
点点分 6814
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-11-24 10:47  Profile | Blog | P.M. 
可参考一下CnPack组件包中的Examples中的DebugSender例子,其中要求定义USE_JCL条件并拿JCL来参与编译,则抛出异常时会在CnDebugViewer中输出出错记录,包括行号。

CnDebug需要的JCL包可在http://www.cnpack.org/showdetail.php?id=534&lang=zh-cn处下载。
Top
stephenmax (绿毛虫)
普通灌水员
Rank: 2



UID 4757
Digest Posts 0
Credits 91
Posts 44
点点分 91
Reading Access 10
Registered 2007-1-19
Location SNDA
Status Offline
Post at 2008-11-25 06:07  Profile | Site | Blog | P.M.  | QQ
恩,我也曾经问过类似问题,试用对比了jcl和madExcept。

如果不介意用商业代码的话,,强力建议用madExcept

原因如下:

smart:
madExcept代码精简短小,如果只是用其中获得异常时Call Stack情况的功能的话,编译后的程序之后增加很小的大小。而jcl,做引用一个单元,右引用一个,层层下来至少引用数十个,如果在代码的别处没有用到jcl的话,会让最终程序增加不少大小。两者记得是几百k的差别

easy:
madExcept非常好用,一句话就可以获得到Call Stack,也支持多种调试信息的格式。我的用法是把获得异常时Call Stack情况的代码,也就是madExcept的代吗,编译到一个dll里面,无须在主执行文件里面编译进madExcept。而jcl捕获异常要加多处代码,如果捕获dll里面的异常调用堆栈还要额外处理,更关键的,我始终没找到主执行文件里面不编译进jcl而通过dll来获取Call Stack的办法。。

另外调试信息也有好几种。我用了jdbg,感觉比较方便,获得的信息也最全,还不用增加编译出程序的大小。map文件也不错,就是感觉有点太透明了,感觉很傻,另外因为是文本文件,解析也有点慢,不过一般的程序倒也不会几十ms就出个异常..


另外要注意,无论是用哪个,如果使用它提供的显示异常信息的人机界面友好的对话框、写日志、发邮件等功能的话,exe都会增加可观的体积

[ 本帖最后由 stephenmax 于 2008-11-25 06:23 编辑 ]
Top
stephenmax (绿毛虫)
普通灌水员
Rank: 2



UID 4757
Digest Posts 0
Credits 91
Posts 44
点点分 91
Reading Access 10
Registered 2007-1-19
Location SNDA
Status Offline
Post at 2008-11-25 06:11  Profile | Site | Blog | P.M.  | QQ
这是我上面说到的dll写出的异常时的call stack trace日志的一个例子
能具体到出错的行和单元,能列出有用的call stack (无用的内容madExcept已经自动隐去),感觉到这种程度已经够用了。。

2008-10-19 14:18:28 在CanonCore.dll : uniMyClasses的第801行(uniMyClasses.TCachePool.GetEnumerator)发生严重错误.     
Canon Engine将立即终止.
Reason:
Access violation at address 003C872A in module 'CanonCore.dll'. Read of address 00000004
Stack Trace:
003c872a +006 CanonCore.dll uniMyClasses       801  +1 uniMyClasses.TCachePool.GetEnumerator
003c85c4 +024 CanonCore.dll uniMyClasses       603  +8 uniMyClasses.TLinkList.Clear
003c8631 +00d CanonCore.dll uniMyClasses       620  +1 uniMyClasses.TLinkList.Destroy
003ca373 +01f CanonCore.dll uniCacheManager    151  +3 uniCacheManager.TCacheManager.Destroy
003ca512 +00e CanonCore.dll uniCacheManager    289  +1 uniCacheManager.TCacheManagerThread.Destroy
003c9ed2 +026 CanonCore.dll uniResourceManager  71  +4 uniResourceManager.TResourceManager.Destroy
003c9c5a +07a CanonCore.dll uniCanonEngine     185 +20 uniCanonEngine.TCanonEngine.Shutdown
003c9931 +00d CanonCore.dll uniCanonEngine      83  +1 uniCanonEngine.TCanonEngine.Destroy
003cf944 +1a8 CanonCore.dll CanonCore           84 +47 CanonCore.GameMain
Module List:
00370000 CanonCore.dll  0.1.1.1120        H:\work\work\Canon Engine\Engine\bin\debug
00400000 RunCanon.exe                     H:\work\work\Canon Engine\Engine\bin\debug
00410000 CanonUtils.dll 0.1.1.299         H:\work\work\Canon Engine\Engine\bin\debug
010f0000 d3d8thk.dll    5.3.0.900         C:\WINDOWS\system32
4c510000 msctfime.ime   5.2.3790.3959     C:\WINDOWS\system32
4c7f0000 d3d9.dll       5.3.3790.3959     C:\WINDOWS\system32
5ef80000 KsUser.dll     5.3.0.900         C:\WINDOWS\system32
68760000 HID.DLL        5.2.3790.3959     C:\WINDOWS\system32
6db60000 D3DXOF.DLL     5.2.3790.0        C:\WINDOWS\system32
72200000 dinput.dll     5.3.3790.3959     C:\WINDOWS\system32
72c30000 msacm32.drv    5.2.3790.3959     C:\WINDOWS\system32
72c40000 wdmaud.drv     5.2.3790.3959     C:\WINDOWS\system32
73730000 DDraw.dll      5.3.3790.3959     C:\WINDOWS\system32
73a60000 DCIMAN32.dll   5.2.3790.0        C:\WINDOWS\system32
73da0000 dsound.dll     5.3.3790.3959     C:\WINDOWS\system32
74430000 MSCTF.dll      5.2.3790.3959     C:\WINDOWS\system32
74ae0000 USP10.dll      1.422.3790.3959   C:\WINDOWS\system32
75d60000 apphelp.dll    5.2.3790.3959     C:\WINDOWS\system32
76080000 MSASN1.dll     5.2.3790.3959     C:\WINDOWS\system32
760a0000 CRYPT32.dll    5.131.3790.3959   C:\WINDOWS\system32
76180000 IMM32.DLL      5.2.3790.3959     C:\WINDOWS\system32
769e0000 WINMM.dll      5.2.3790.3959     C:\WINDOWS\system32
76b10000 WINTRUST.dll   5.131.3790.3959   C:\WINDOWS\system32
76b70000 imagehlp.dll   5.2.3790.3959     C:\WINDOWS\system32
76eb0000 Secur32.dll    5.2.3790.3959     C:\WINDOWS\system32
76f70000 COMRes.dll     2001.12.4720.3959 C:\WINDOWS\system32
770d0000 SETUPAPI.DLL   5.2.3790.3959     C:\WINDOWS\system32
774b0000 ole32.dll      5.2.3790.3959     C:\WINDOWS\system32
775f0000 oleaut32.dll   5.2.3790.4202     C:\WINDOWS\system32
77680000 CLBCatQ.DLL    2001.12.4720.3959 C:\WINDOWS\system32
77b30000 midimap.dll    5.2.3790.3959     C:\WINDOWS\system32
77b40000 MSACM32.dll    5.2.3790.3959     C:\WINDOWS\system32
77b60000 version.dll    5.2.3790.3959     C:\WINDOWS\system32
77b70000 msvcrt.dll     7.0.3790.3959     C:\WINDOWS\system32
77bd0000 GDI32.dll      5.2.3790.4237     C:\WINDOWS\system32
77c20000 RPCRT4.dll     5.2.3790.4115     C:\WINDOWS\system32
77e10000 user32.dll     5.2.3790.4033     C:\WINDOWS\system32
77f30000 ADVAPI32.dll   5.2.3790.3959     C:\WINDOWS\system32
7c800000 kernel32.dll   5.2.3790.4062     C:\WINDOWS\system32
7c930000 ntdll.dll      5.2.3790.3959     C:\WINDOWS\system32
7f000000 LPK.DLL        5.2.3790.3959     C:\WINDOWS\system32
Top
 




All times are GMT++8, the time now is 2024-10-10 17:58

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009293 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP