核心调试技术(一)

 对于Debug模式下的调试,有很多办法,笔者这里要说的是如何在Release模式下准确获取出错地址所对应的代码行数.

 

1. 生成map文件
   打开Project Settings对话框,选择Link选项卡,然后在Project OPtions编辑框中键入/mapinfo:exports和/mapinfo:lines开关,
   然后选择Category程序清单框上的Debug选项,选中Getnerate Mapfile复选框。


2. 生成pdb文件
   打开Project Settings对话框,选择C/C++选项卡,然后在Project OPtions编辑框中键入/Zi和/Fd"Release/CoCapture.pdb"开关。
   当在Debug info下拉框中选中Program Database时,相当于设置了/Zi开关。


3.指定模块的装载地址
   打开Project Settings对话框,选择Link选项卡,在Category下拉框中选中Output,然后在Base Address输入框中键入装在地址,如:
   0x3000000,或者直接在Project Options编辑框中键入/base:"0x3000000"开关。


 4.计算出错行号:
  首先将出错地址与map文件中的(Rva+Base)的值进行比较,找到第一个大于或等于出错地址的那一行,从而找到出错的文件名和函数,
  然后计算出错点在该文件中偏移量:
  偏移量 = (crash address) - (preferred load address) - 0x1000;
  然后在map文件中找到出错地址所对应的文件,并根据偏移量找出最接近的代码行数。
 
  比如:一个动态链接库Capture.dll的装载地址为0x6fd00000,出错地址为0x6fd02c32,则根据其对应的Capture.map文件中的(Rva+Base)
  部分的值可以看出第一个大于0x6fd02c32的为6fd02c70,故出错函数必定在前一个函数中,该函数地址为0x6fd02b80,
  而其对应的函数为CCaptureScreen中的GetRGBFromDibSection(),
  根据上面的公式计算出错地址在文件中的偏移量:(0x6fd02c32 - 0x6fd00000) - 0x1000 = 0x1c32;
  从CaptureScreen.obj中可以查到1561 0001:00001c25这行,而其后1562 0001:00001c3b的偏移地址为0x1c3b大于0x1c32,
  因此出错在1561行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值