程序调试经验

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与相关的程序的版本对应关系一定要认真记录,避免混淆;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值