程序调试经验
来源:互联网 发布:centos burpsuite 编辑:程序博客网 时间:2024/04/30 23:52
1.使用 vc的alt + 6查看
2.在开发过程中,编译release版本的程序(包括EXE、DLL、OCX等二进制程序)时,要建立相关的mapfile,即映像文件。方法如下(VC):
(1) 选择release版本;
(2) Project settings => C/C++ => Debug Info,选
“Line Number Only”;
(3) Project settings => link => 选中 “Generate mapfile”;
(4) Project settings => link => Project Option中,输入 :
/mapinfo:lines
这样,编译后就会生成一个*.map的文本文件,其中包含了release版本程序的相关信息。
当程序出现GPF时,记下指令地址,然后可以在map文件中的Rva+Base 段查找相关的信息。
比如:H1接口程序,出错指令为0x0040d7a0,在map文件中,可发现:
0001:0000c730 ?RefreshDevList@@YGIPAX@Z 0040d730 f FFServer.obj
其中 0040d730是小于0040d7a0的最大地址,则可初步断定是在RefreshDevList函数中出的问题。下一步是定位出错代码在源程序中的行数,mapfile中包含了相关信息。定位方法是先计算偏移量,公式为:
(crash address) - (preferred load address) - 0x1000
其中(preferred load address)在mapfile首部可以找到。然后,在mapfile中的相关源程序代码行信息段中搜索即可。
在没有mapfile,比如编译时未添加相关选项的情况下,可以用反汇编工具,如Win32Dasm将出错的程序反汇编,找到相关指令并分析。
有时,出错指令地址并不在程序的mapfile中,比如:0x77fcc665。
这一般是在出错程序调用的系统DLL中,比如msvcrt.dll、ntdll.dll等。可以用一个小工具CrashFinder来查找。0x77fcc665查找的结果是RtlSizeHeap + 000007EA,ntdll.dll。同时,还可以启动调试器(如VC),查看call stack等信息,找到出错指令的上下文。尽量正确能在mapfile中定位。
在《Debugging Applications》一书中有详细的说明。
总之,希望开发者和测试者能注意以下几点:
(1) 发行版(release)的程序,包括DLL、OCX,一定要输出map file;
(2) map file与相关的程序的版本对应关系一定要认真记录,避免混淆;
- 程序调试经验
- 程序调试经验
- 程序调试经验~认证基盘测试程序初期调试~。
- 在VS2008下调试OpenGL程序经验
- 调试经验
- 调试经验
- 调试经验
- 使用windbg调试托管程序的一些零散经验
- 最近发现 果断不会调试程序啊 经验太少
- opencv1.0 vc6.0 视频获取显示程序调试经验
- javascript调试经验
- Tomcat调试经验。
- 项目调试经验1
- 项目调试经验2
- Tomcat调试经验。
- BCB 串口调试经验
- 吐血VB6调试经验
- OpenCV调试经验
- 本立道生,道以为用
- 解密SQL Server 2005中被加密的存储过程、函数、视图、触发器
- Flash activex控件版本信息
- s:radio 提交表单后,返回服务器的值并默认选中前次提交的值 value
- C#代码关闭Windows XP
- 程序调试经验
- Struts2自定义拦截器实例—Session超时的处理
- 杨中科:我的大学生活 转载
- 利用WebClient类向服务器上载文件
- 云计算中的重要概念:MapReduce
- 仅通过崩溃地址找出源代码的出错行
- C#实时获取CPU利用率
- jasperreport实现Html、Pdf、Rtf、Excel、Xml报表导出
- 网页中滑动导航菜单制作