Subject:
求程序报地址错退出的分析方法
[Print This Page]
Author:
treemon
Time:
2008-9-24 13:31
Subject:
求程序报地址错退出的分析方法
1、Release版本加入调试信息
听朋友介绍VC编的程序Release版本在出现地址错时,通过pdb文件可以定位到代码行,
请问Delphi在编译一个没有调式信息的版本时,出现地址错,如何实现类似上面的功能;我只会查map文件的方法;
2、报错现场保存
我目前是用了JCL能将报错的Call Stack保存下来,
朋友介绍VC中使用StackWalker能生成dmp格式文件,利用该文件可以用VC或WinDbg调试。
请大家介绍一下Delphi中实现类似功能的方法,或其他思路。多谢!
Author:
sdsyjh
Time:
2008-10-28 09:01
报错时立即打开CPU窗口,就可以看到程序错在哪一行代码。
Author:
mentoro
Time:
2008-11-23 11:59
我现在也是有这个问题,主程序退出时报错,调用DLL时一释放就引起这样的错误,主要是我们的DLL有一个报表组件,好像不支持DLL
Author:
Passion
Time:
2008-11-23 13:04
我们一般是带调试信息(或带MAP文件)来编译EXE与DLL,然后用JCL或封装了Jcl的CnDebug来一块编译进去。这样在出异常的时候就能记录下出错的地方,然后根据堆栈与编译信息来找出源码中的行号。CnWizards就是这么用的。
Author:
mentoro
Time:
2008-11-24 09:47
能否具体一点
Author:
Passion
Time:
2008-11-24 10:47
可参考一下CnPack组件包中的Examples中的DebugSender例子,其中要求定义USE_JCL条件并拿JCL来参与编译,则抛出异常时会在CnDebugViewer中输出出错记录,包括行号。
CnDebug需要的JCL包可在
http://www.cnpack.org/showdetail.php?id=534&lang=zh-cn
处下载。
Author:
stephenmax
Time:
2008-11-25 06:07
恩,我也曾经问过类似问题,试用对比了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 编辑
]
Author:
stephenmax
Time:
2008-11-25 06:11
这是我上面说到的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
Welcome to CnPack Forum (http://bbs.cnpack.org/)
Powered by Discuz! 5.0.0