VC release版本调试.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VC release版本调试

读了老罗的“仅通过崩溃地址找出源代码的出错行”下称罗文一文后感觉该文还是可以学到不少东西的。不过文中尚存在有些说法不妥以及有些操作太繁琐的地方 。为此本人在学习了此文后在多次实验实践基础上把该文中的一些内容进行补充与改进希望对大家调试程序尤其是release版本的程序有帮助 。欢迎各位朋友批评指正。 一、该方法适用的范围 在windows程序中造成程序崩溃的原因很多而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃。如原文中举的除数为零的崩溃例子。而笔者在实际工作中碰到更多的情况是:指针指向一非法地址 然后对指针的内容进行了读或写的操作。例如 void Crash1 char p char100 p100 这些原因造成的崩溃无论是debug版本还是release版本的程序使用该方法都可找到造成崩溃的函数或子程序中的语句行具体方法的下面还会补充说明。 另外实践中另一种常见的造成程序崩溃的原因:函数或子程序中局部变量数组越界付值造成函数或子程序返回地址遭覆盖从而造成函数或子程序返回时崩溃。例如: include void Crash2int mainint argcchar argv Crash2 return 0void Crash2 char p1 strcpyp0123456789 在vc中编译运行此程序的release版本会跳出如下的出错提示框。 图一 上面例子运行结果 这里显示的崩溃地址为:0这种由前面语句造成的崩溃根源在后续程序中方才显现出来的情况显然用该文所述的方法就无能为力了。不过在此例中多少还有些蛛丝马迹可寻找到崩溃的原因:函数Crash2中的局部数组p只有一个字节大小 显然拷贝0123456789这个字符串会把超出长度的字符串拷贝到数组p的后面即p11p22p33p44。。。。。。而字符1的ASC码的值为0x312为0x323为0x334为0x34。。。。。由于intel的cpu中int型数据是低字节保存在低地址中 所以保存字符串1234的内存显示为一个4字节的int型数时就是0显然拷贝0123456789这个字符串时1234这几个字符把函数Crash2的返回地址给覆盖 从而造成程序崩溃。对于类似的这种造成程序崩溃的错误朋友们还有其他方法排错的话欢迎一起交流讨论。 二、设置编译产生map文件的方法 该文中产生map文件的方法是手工添加编译参数来产生map文件。其实在vc6的IDE中有产生map文件的配置选项的。操作如下:先???击菜单Project-Settings。。。弹出的属性页中选中Link页 确保在category中选中General最后选中Generate mapfile的可选项。若要在在map文件中显示Line numbers的信息的话 还需在project options 中加入/mapinfo:lines 。Line numbers信息对于罗文所用的方法来定位出错源代码行很重要 但笔者后面会介绍更加好的方法来定位出错代码行那种方法不需要Line numbers信息。 图二 设置产生MAP文件 三、定位崩溃语句位置的方法 罗文所述的定位方法中找到产生崩溃的函数位置的方法是正确的即在map文件列出的每个函数的起始地址中最近的且不大于崩溃地址的地址即为包含崩溃语句的函数的地址 。但之后的再进一步的定位出错语句行的方法不是最妥当因为那种方法前提是假设基地址的值是 0以及一般的 PE 文件的代码段都是从 0x1000偏移开始的 。虽然这种情况很普遍但在vc中还是可以基地址设置为其他数比如设置为0时仍旧套用 崩溃行偏移 崩溃地址 - 0- 0x1000 的公式显然无法找到崩溃行偏移。 其实上述公式若改为 崩溃行偏移 崩溃地址 - 崩溃函数绝对地址 函数相对偏移 即可通用了。仍以罗文中的例子为例:罗文中提到的在其崩溃程序的对应map文件中崩溃函数的编译结果为 0001CrashYAXXZf CrashDemo。obj 对与上述结果在使用我的公式时 崩溃函数绝对地址函数相对偏移指当崩溃地址 0x0040104a时 则 崩溃行偏移 崩溃地址 - 崩溃函数起始地址 函数相对偏移 0x0040104a - 0 00x4a结果与罗文计算结果相同 。但这个公式更通用。 四、更好的定位崩溃语句位置的方法。 其实除了依靠map文件中的Line numbers信息最终定位出错语句行外在vc6中我们还可以通过编译程序产生的对应的汇编语句二进制码以及对应c/c语句为一体的cod文件来定位出错语句行

您可能关注的文档

文档评论(0)

153****9595 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档