如何使用vs调试.net framework代码 (一)
经常我们在开发软件时候(特别是使用第三方库时),对于发生的异常和错误,由于拿不到底层框架的源代码,所以小白们经常靠猜,或者直接放弃。正常程序员虽然能使用断点跟踪自己写的代码。但对于从黑盒底层丢出来的错误究竟本质是什么原因引起也是抓狂的。
今天我把三招应付的办法介绍给大家
招一: 多谢 微软 半开放了.net框架 各版本的源代码可大家观摩. 地址: http://referencesource.microsoft.com/
(注意, 虽然有提供下载,但人家说了,,,源码有意缺了各种文件,所以只能看,不能通过编译运行的哦)
招二: 让vs支持 .net framework 程序集的调试
打开vs IDE , 在 工具-->选项, 弹出来的对话窗中找到 调试-->做以下5点设置
取消 仅调试我的代码 --- > 当然是还要调别人的代码了
取消 按过程执行属性和运算符 ---> 当然可以跳进属性和运算符背后的函数去调试啦
取消 要求源文件与原始版本完全匹配 --> 放松严格对应,否则可能抓不到断点, 但是副作用是, 就算能查看源代码,但不一定就是哪一句,即你看到的不一定是真像
打开 .net Framework源代码单步执行 ---> 当然啦, 主要是针对 .net 框架啦
打开 启用源服务器支持 --> 默认已配置了Mirosoft官方的符号服务器地址, 会从那里下载,你项目用到的.net程序集 符号文件, 副作用就是 程序集引用越多, 下载越慢, 你本机与microsoft符号服务器的网速和质量也会影响快慢
首次使用时,会进入慢长的下载过程 (如设置了仅加载指定模块,且项目较少时会快点)
加速下载的办法:
调试-->符号 ---> 增加自己的符号服务器地址 (如果有的话)
自动加载符号首选项---> 仅加载选定模块
把你可能要观察的引用程序集名字 添加进去, 比如 system.Web.dll
当然也可以用通配符 如: System.Web.*
如此一来,当你按下 F5 让你开发的程序进入调试状态后,即可以按F10 或 进入特点的函数,选择函数后,就可以查看底层的源代码了,理想状态下,当光标定位到变量时,还能查看到变量的成员及成员值. 如图所示
示例: 比如, 我预先在 23行 设置断点,目的是想查看 RouteTable.Routes属性的代码运行情况
跳进了指定的函数中 (只有能命中并且加载该程序集符号文件情况下)
可以查看对象的成员状态
但如果程序集的符号文件未找到时,可能会弹出以下页面, 请手动指定,如果没有,就没办法了, 忽略它吧.
注意事项: 1. 如果你指定了加载模块 --->解决办法:就确保你要进入的程序集符号文件也正确加载,否则无法进入指定的函数
2 .有时变量无法计算出值, 有时变量某些成员值无法计算; -->解决办法:没办法
3. 有时定位的源代码不一定就是执行的代码( 这就是源码与符号文件版本不严格一致的问题了) --->解决办法: 尽量确保符号文件与程序集的版本差异小, 不要迷信看到的.
4.有时第一次可以进入的断点,下次就进不去了 -->解决办法: 重新编译自己的程序集,以清掉缓存
5. 有些函数仍然进入不了. --->我也不清楚原因
6. 现在还有一个问题,就是没有办法预先定位要进入的中断位置, 就是因为目前没中断前你是无法控制断点的, 因为底层源代码你又没有.
对于解决这个问题,就要请出第三招 ,vs的 函数中断法
招三. (待续) 点这里: 如何使用vs调试.net framework代码 (二)(完)