事情是这样的, 最近需要开发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. kubernetes1.4新特性:支持Docker新特性

    (一)背景资料 在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dockerremote API,这个项目在https:// ...

  2. sql —— check

    CHECK 约束用于限制列中的值的范围. 原表: 现在要对性别这一列进行约束,只准值为男或者女. 步骤: 1. 2. 3. 4. 5. ctrl + s 保存一下, 现在不可以随意的修改性别了. 完成 ...

  3. Person Re-identification 系列论文笔记(一):Scalable Person Re-identification: A Benchmark

    打算整理一个关于Person Re-identification的系列论文笔记,主要记录近年CNN快速发展中的部分有亮点和借鉴意义的论文. 论文笔记流程采用contributions->algo ...

  4. 纯CSS3打造圆形菜单

    原理是使用相对定位和绝对定位确定圆形菜单位置. 使用伪类选择器E:hover确定悬浮时候的效果,动画效果用CSS3的transition属性. 大概代码如下. html: <div id=&qu ...

  5. js原生复习2.0

    // 1.闭包的作用// 实现共有变量,函数累加器的实现// 可以做缓存以及储存结构// 可以实现封装,实现属性私有化// 模块开发,防止全局污染// var name = 123;// var in ...

  6. iOS开发 分享到QQ空间提示"分享失败 应用不存在"

    本人遇到该问题的原因是配置SDK初始化时的APPID错误,可以参考下shareSDK的集成文档中的一段话: 可选:支持QQ所需的相关配置及代码 登录QQ互联(http://connect.qq.com ...

  7. laravel 的路由中间件

    简介# Laravel 中间件提供了一种方便的机制来过滤进入应用的HTTP请求.例如,Laravel 内置了一个中间件来验证用户的身份认证 , 如果没有通过身份认证,中间件会将用户重定向到登陆界面,但 ...

  8. 在 windows 安装 Jekyll

    本文告诉大家一个简单的方法在 Windows 安装 Jekyll 下载 ps1 文件 首先需要安装 Chocolatey ,这个工具可以快速安装 Jekyll 先下载Chocolatey,如果无法从这 ...

  9. HZOJ 寿司

    这题也是挺神仙的,现在O(n)的解法还没打出来,只是用O(nlogn)卡过去了(理论上可以过),sdfz某大佬用三分拿到了65分…… 考试连暴力都没打出来…… n2暴力T40: 首先将环拆成链,我们可 ...

  10. mysql数据库之mysql下载与设置

    下载和安装mysql数据库 mysql为我们提供了开源的安装在各个操作系统上的安装包,包括ios,liunx,windows. mysql的安装,启动和基础配置-------linux版本 mysql ...