使用windbg调试release程序

不想你离开。 提交于 2020-05-01 04:34:34

简介:最近经常会碰到客户那边出现各种奇怪的问题,由于日志不可能完全记录运行信息,又或者日志回滚导致记录信息丢失等,无法定位bug出现位置,这时你非常希望自己的能够单步调试。下面是vs2008+windbg研究的结果,可能存在不完善的地方,希望牛人不吝赐教,互相学习。<br/> 补充:一般写完程序之后,自己会写一些测试用例来测试自己写的程序,进行完单元测试之后会交由测试部进行测试,但是不能够保证所有的bug都会被测试出来,多数会由客户电脑负责的环境导致程序出现一些莫名其妙的问题,废话不多说了。<br/>


调试环境

测试环境:windows 7<br/> 开发工具:vs2008, windbg6.3.9600<br/> ##调试代码## #include <stdio.h> void TestFunc(int nVar, char *pStr) { printf("juest print nVar:%d, pStr:%s\n", nVar, pStr ? pStr:"null"); }

void main()
{
TestFunc(1, "hello world!");
}

##vs2008 release模式设置##

  • /Zi 该命令是生成PDB文件中包含变量名和函数名,不会影响到优化选项(生成代码时vs release版会对代码进行优化) ![在此输入图片描述][1]

  • /01 优化模式,这个会最大优化生成二进制文件大小

![在此输入图片描述][2]<br/>

  • 使用以上设置使用windbg调试,设置PDB的路径,通过打开File->Symbol File Path

![在此输入图片描述][3]<br/> ![在此输入图片描述][4]<br/>

由于上传图片200kb限制,我只能分成两张图片上传,图片中你会发现,堆栈中TextFunc的参数并非我们想要看到的参数,那时候因为编译器对我么的生成文件做了优化,这时你需要通过Memory来根据参数地址去查看参数的值,如果对于软件运行速度没有太大的要求,建议设置下面的一种方式。<br/>还有就是我们只设置了Symbol符号,并没有设置Source符号,但是确显示可以看到原文件,那是因为符号文件中有记录源文件的位置,如果换台机器,那么将不会看到源文件,这是你就要设置一下源文件的路径了。<br/>

  • /Od 禁用优化 可能会影响到release版本运行的速度,但对我们调试是很有帮助的,不用再去查内存

![在此输入图片描述][5]

  • 这时我们再使用windbg调试,那么将会跟使用vs调试基本一样

![在此输入图片描述][6]

总结:以上就是学习windbg去调试release发行程序的方法,如果有好的方法我们可以一起学习,欢迎前来指导! [1]: http://static.oschina.net/uploads/space/2014/0527/215627_ViHU_1448554.jpg [2]: http://static.oschina.net/uploads/space/2014/0527/222824_JYXc_1448554.jpg [3]: http://static.oschina.net/uploads/space/2014/0527/223622_JnEg_1448554.jpg [4]: http://static.oschina.net/uploads/space/2014/0527/223750_MtXI_1448554.jpg [5]: http://static.oschina.net/uploads/space/2014/0527/224613_STWx_1448554.jpg [6]: http://static.oschina.net/uploads/space/2014/0527/224857_e82c_1448554.jpg

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!