很多.net 程序员不知道又非常重要的 .net高级调试技巧.调试别人的dll方法内的变量
事情是这样的, 最近需要开发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方法内的变量的更多相关文章
- 程序员为什么要写if else,为什么要和别人不一样
程序员为什么要写if else,为什么要和别人不一样 前言 无聊,睡不着!本文只是随便写写而已!感叹一下程序员的生活! 刚看到一个八级程序员的分级,所以就写了这个随笔,分级如下: 第八级 ...
- 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧
30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...
- 8个对程序员来说有用的jQuery小贴士和技巧
1) 禁用鼠标右键单击 jQuery程序员可以使用此代码在网页上禁用鼠标右键点击. 1 2 3 4 5 6 7 8 9 10 $(document).ready(function() { // ...
- 除了不要 SELECT * ,程序员使用数据库还应知道的11个技巧
SQL:sum里加条件SELECT SUM( CASE WHEN "V7010" BETWEEN 0 AND 0.1 THEN 1 ELSE 0 END) FROM "C ...
- 百分之 95% 的程序员不知道 Trending 是什么。
前言如果学习到的知识不成体系,那么遇到问题时就会非常难解决.常有人问你从哪里了解新技术怎么判断其发展趋势的,除了关注 Hacker News 以及庞大的 Awesome 还有没有其它方式?有啊当然是每 ...
- Spring AOP注解为什么失效?90%Java程序员不知道
使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...
- 《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法
由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的 ...
- 前端程序员应该知道的15个 jQuery 小技巧
下面这些简单的小技巧能够帮助你玩转jQuery. 返回顶部按钮 预加载图像 检查图像是否加载 自动修复破坏的图像 悬停切换类 禁用输入字段 停止加载链接 切换淡入/幻灯片 简单的手风琴 让两个div高 ...
- 前端程序员应该知道的 15 个 jQuery 小技巧
下面这些简单的小技巧能够帮助你玩转jQuery. 返回顶部按钮 预加载图像 检查图像是否加载 自动修复破坏的图像 悬停切换类 禁用输入字段 停止加载链接 切换淡入/幻灯片 简单的手风琴 让两个div高 ...
随机推荐
- 【Django入坑之路】基础操作(过滤,继承,跳转)
1:自定过滤器 1创建templatetags文件夹 2在里面创建自定义py文件:固定格式: from django import template from django.utils.safestr ...
- php json_encode输出为空问题
这种情况一般是json_encode序列化数组时出现错误,错误原因有很多,可以通过json_last_error函数来查看错误原因!!! 可能的原因 ------------------------- ...
- HLSL效果框架
原文:HLSL效果框架 HLSL效果框架能简化许多操作.这里先不写具体的效果框架的程序,在处理多光源光照的时候再整理. 下一章:效果框架-多种光源的多光源 叠加效果 这儿先列出效果框架的一个注意点: ...
- python 列表创建
- Gym - 101617D_Jumping Haybales(BFS)
Sample Input 4 2 .### #... .#.. #.#. 3 1 .#. .#. .#. Sample Output 4 -1 题意:给一个n*n的图,每次最多能跳k个格子,只能向南( ...
- POLARDB 2.0 重磅升级,分别支持Oracle与PostgreSQL
点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 POLARDB 2.0 重磅升级 2019年6月19日15时,阿里云 POLAR ...
- 洛谷 3174 [HAOI2009]毛毛虫
题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入输出格 ...
- axios用headers传参,设置请求头token
新建一个配置文件http.js // 导入axios import axios from 'axios'; // 全局配置默认路由 axios.defaults.baseURL = 'http://1 ...
- CSS属性Display(显示)和Visibility(可见性)
隐藏一个元素可以通过把display属性设置为“none”,或把visibility属性设置为“hidden”.但是请注意,这两种方法会产生不同的效果. Visibility:hidden可以隐藏某个 ...
- idea actiBPM插件生成png文件 (解决没有Diagrams或Designer选项问题)
版权声明:随便转, 记得给个链接过来哦 https://blog.csdn.net/wk52525/article/details/79362904 idea对activiti工作流的支持没有ecli ...