事情是这样的, 最近需要开发Orcale的数据库.
于是使用了EF 加上 Oracle.ManagedDataAccess.Client

这个Oracle.ManagedDataAccess 很好用, 不需要orcale 客户端就能用.
但是这个类库有个地方不是非常好用. 数据读取出了问题,它的提示非常非常让人气愤. 啥调试信息都没有..只有一个提示 “类型转换异常”.
大家经常遇到的. InvalidCastException
异常就异常呗, 问题是查找问题的信息太少了.
我不知道是哪条数据导致的这个问题.
如果有一万条数据. 其中某一条出错了. 我不是要崩溃了??
而且还不知道是哪个字段列出了问题…

具体是如何解决这个问题的? 咱们再细细谈来. 里面可多道道了…
准备好板凳哈..学会了, 你就不怕一些莫名其妙的异常了. 自己动手找问题点…百度什么的都是新手用的了…

首先出错了报异常, 肯定要捕获异常.
异常信息里面的StackTrace 非常详细的记录了出错的具体函数.

从图上可以看出.
在 Oracle.ManagedDataAccess.Client.OracleDataReader.GetString(Int32 i)
这个方法中因为读取第i个数据出错了.并且是转换为string.

Oracle.ManagedDataAccess 并没有公布源代码, 我们也不知道里面做了什么事情.
好吧,搬出.Net Reflector 先看看这个函数里面的代码是怎么写.

后来我反编译了.Oracle.ManagedDataAccess的源代码. 一看. 果然有2个InvalidCastException 第一个是有具体信息的.. 但是第二个就是光溜溜的InvalidCastException 了. 我猜应该是第二个InvalidCastException了.

好吧,到现在为止. 我们也大概的知道了GetString(i)这个函数里面做了什么事情. 有几种情况会出这个异常..
好吧, 到这里有些大神估计就不会再调试了. 根据代码也能猜出来是那里的问题..

但是这个地方.我想知道是哪个列出了问题? internalType 在出错的时候是什么类型?
传入的参数 i 又是多少?

下面本文的主题关键来了… 如何知道这个方法的内部变量的值?
我曾经相关n多个方法, 其中包括继承重载,dll反编译重写, Trace取信息等等.方法.
结果都无法取到这个内部变量的值.再多种方法无果的情况下. 我把眼光转向了vs调试工具. 按道理说. vs调试时能取到我的变量的值,也自然能取到别人变量的值. 嗯….

如果你的代码是像我下面这样写的. 那么你的代码出错是肯定不能停止在下面的第2个箭头处.

正常应该是直接跳进第1个箭头的地方了.
好吧,本文的第一个重点. 要修改你的vs配置. vs的默认配置是不会像我的那样停止的.
具体配置是.

第一点. 源代码不可用时显示反汇编.. 这个是为什么要启用呢? 如果不启用你就无法调试内部变量了.
第二点. 如果启用了 仅我的代码 那么别人的代码也不会调试的.
另外插一句. 里面的两个三角形地方如果勾上了. 你就可以调试.net源代码了. 只是第一次调试要下载pdb符号文件比较慢. 所以我这里就去掉了.

好吧,上面两点设置好以后还有非常重要的第三点.

第三点.

这个地方,查找到你要处理的异常….
勾上它, 勾上以后, 只要出现这种异常,程序立马停止. 进入中断状态. 而不会跑到你的catch 中…
为啥不能跑到你的catch中? 如果进入到你的catch以后. 那么很不幸. 你就无法调试具体出错函数的内部变量了. 已经被回收了..

所以这里也很重要.

OK到这里, 我们已经把设置都弄好了.
下面我们来试一下.如何取得变量信息. 里面还有点技巧哦..
程序跑起来, 直到出错…

上图已经比较明确了. 调试时的2个比较重要的窗口, 一个是调用堆栈,另外一个是局部变量. 这个局部变量会自动显示当前调用层的局部变量… 注意是当前调用层哦.
而且这个当前调用层可以改变的. 如何改变? 双击”调用堆栈” 的函数就可以改变当前的调用层了.
那么,我们来看一下. 在Oracle.ManagedDataAccess.Client.OracleDataReader.GetString(Int32 i)这个函数里面出错时的i 的数值是多少?

到这里, 基本上已经能解决绝大多数问题了…
但是有的时候我们还想知道其它的变量怎么办?
例如源代码里面的. internalType . 我想知道它是什么类型…
补个源代码的图,方便大家参考.

这个要借助 vs提供的另外一个工具. 监视器.

好啦,到此结束..
有了这个工具, 还有什么问题调试不出来?

要是.net能提供 捕捉监视的变量的dll 功能就好了.
方便程序员自动捕捉内容和变量值. 直接远程就能诊断程序了.
————————————————
版权声明:本文为CSDN博主「走错路的程序员」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/phker/article/details/78570073

很多.net 程序员不知道又非常重要的 .net高级调试技巧.调试别人的dll方法内的变量的更多相关文章

  1. 程序员为什么要写if else,为什么要和别人不一样

    程序员为什么要写if else,为什么要和别人不一样 前言 无聊,睡不着!本文只是随便写写而已!感叹一下程序员的生活! 刚看到一个八级程序员的分级,所以就写了这个随笔,分级如下:        第八级 ...

  2. 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧

    30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...

  3. 8个对程序员来说有用的jQuery小贴士和技巧

    1) 禁用鼠标右键单击 jQuery程序员可以使用此代码在网页上禁用鼠标右键点击. 1 2 3 4 5 6 7 8 9 10 $(document).ready(function() {     // ...

  4. 除了不要 SELECT * ,程序员使用数据库还应知道的11个技巧

    SQL:sum里加条件SELECT SUM( CASE WHEN "V7010" BETWEEN 0 AND 0.1 THEN 1 ELSE 0 END) FROM "C ...

  5. 百分之 95% 的程序员不知道 Trending 是什么。

    前言如果学习到的知识不成体系,那么遇到问题时就会非常难解决.常有人问你从哪里了解新技术怎么判断其发展趋势的,除了关注 Hacker News 以及庞大的 Awesome 还有没有其它方式?有啊当然是每 ...

  6. Spring AOP注解为什么失效?90%Java程序员不知道

    使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...

  7. 《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法

    由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的 ...

  8. 前端程序员应该知道的15个 jQuery 小技巧

    下面这些简单的小技巧能够帮助你玩转jQuery. 返回顶部按钮 预加载图像 检查图像是否加载 自动修复破坏的图像 悬停切换类 禁用输入字段 停止加载链接 切换淡入/幻灯片 简单的手风琴 让两个div高 ...

  9. 前端程序员应该知道的 15 个 jQuery 小技巧

    下面这些简单的小技巧能够帮助你玩转jQuery. 返回顶部按钮 预加载图像 检查图像是否加载 自动修复破坏的图像 悬停切换类 禁用输入字段 停止加载链接 切换淡入/幻灯片 简单的手风琴 让两个div高 ...

随机推荐

  1. switch范围判断

    <?php function grade($grade){ switch (true) { case $grade>=90: echo 'A'; break; case $grade> ...

  2. jQuery show hide方法 二级菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [React Native]StatusBar的使用

    StatusBar是React Native 0.20 新增的跨平台组件,它可以用来设置并动态改变设备的状态栏显示特性. 虽然说是跨平台的组件, 但是有些属性不是跨平台的 ,我们需要注意下.因为IOS ...

  4. Centos7.3-mysql5.7复制安装过程

    一.环境 192.168.56.102 为主服务器 192.168.56.101 为从服务器 Mysql5.7.20 二进制安装包环境 1. 下载免编译安装包并进行安装 从官网下载 mysql-5.7 ...

  5. Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    前言 容器技术的发展让软件交付和运维变得更加标准化.轻量化.自动化.这使得动态调整负载的容量变成一件非常简单的事情.在kubernetes中,通常只需要修改对应的replicas数目即可完成.当负载的 ...

  6. Flask学习之九 分页

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination 中文翻译地址:http:// ...

  7. 2018-2-13-win10-uwp-如何让WebView标识win10手机

    title author date CreateTime categories win10 uwp 如何让WebView标识win10手机 lindexi 2018-2-13 17:23:3 +080 ...

  8. UITableView 刷新问题

    遇到的问题: 在程序里异步请求服务器后回调函数中处理数据和界面数据的刷新,但是更新UITableView的时候总是很慢才更新完,打印TableView的代理方法也都很快打印. 解决办法就是: [sel ...

  9. Bitmap的recycle问题

        虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.如果只是使用少量的几张图片,回收与否关系不大.可是若有大量bitmap需要垃圾回收处理,那必然垃 ...

  10. vue-awesome-swiper轮播插件的使用方法及问题。

    在使用vue-awesome-swiper的时候,遇到一些问题,记录一下!       1.npm 安装 npm install vue-awesome-swiper --save 2.使用 在mai ...