上次我们提到,没有源代码而且没有调试符号,我们也可以 Debug。有人可能会问,我什么时候需要在这种情况下调试吗?!
是的。比方说,我们用了某些第三方的组件,这些组件里面难免也会有 Bug。就算是微软发布的 .net 组件,我们在某些个别的例子中发现了 Bug。就算这些人家的组件都没有问题,有时候我们也不得不在程序运行到组件中的某些语句时候查看一些数据。
举个栗子:我们的程序用了某个组件A。当用户鼠标单击A的一个窗口的时候,A的某个方法应该回掉我们的一个方法。可是它竟然没有(我们在自己的方法上加了断点,没有被击中)!如果我们在这个时候能够给组件中点击事件的处理函数加上断点,我们就可以探一探究竟了。
下面我们就从易到难来看看如何调试别人家的组件。
我们先来看如何调试 .NET Framework 的组件。
1. 我们对 VS 的 Options -> Debugging -> General 做一些配置,如下图:
2. 我们要缓存 .NET 的调试符号, 到 Options -> Debugging -> Symbols, 设置 Cache symbols in this directory 到一个本地的路径。
配置完成,我们来做个实验。我们知道每个 WPF 的窗口的构造函数内都会调用一个 InitializeComponent() 方法。我们今天想看看这个方法它到底干了什么。基于以上两点配置,我们新建一个 WPF 程序,然后给这个方法设断点,当程序运行到该语句时,我们点击F11,哈,我们就进入了微软的代码,请看:
是不是感觉很酷?
调试第三方的组件
这个我们要分几种情况来看:
A. 第三方提供了调试符号
这种情况最简单。基于我们以上的设置,我们只需要把调试符号放到这些组建相同的目录下即可。放到别处也可以,我们需要 VS 的 Options -> Debugging -> Symbols 添加一个新的 Symbol file location,然后开始我们的调试。
B. 第三方没有提供调试符号,但代码发布时没有扰码
这种情况也比较好办。市场上有很多的反编译工具,免费的就有不少比方说 JustDecompile,dotPeek 等。他们不仅能反编译,还能产生调试符号,以便我们进行调试。举个例子,我用 JustDecompile 打开了 log4net.dll(请点击 Generate PDB):
有了调试符号,我们要做的就跟情况A一样了。
C. 第三方没有提供调试符号,但代码发布时扰码了
这种情况比较难办。我们的目标还是一样的,需要有没有扰码的组件及调试符号。余下的都是一样的。市场上有没有反扰码的工具呢?有,还有开源的呢。今天就告诉大家一个,名叫 de4dot,这个项目在 GitHub 的地址是:https://github.com/0xd4d/de4dot. 通过这个工具,我们可以把扰码后生成的组件变成非扰码的组建。剩下的还要做什么,相信大家都知道了吧(参考情况B)?
可惜的是,对于深度扰码的组件,我们就需要更高级的反扰码工具。当然,我们也不需要这么做。情况C我们只会在极端情况下才会面对,对吧?
哈哈,今天就到这里啦!
 

Visual Studio 调试技巧 (三) -- 调试第三方组件代码的更多相关文章

  1. Visual Studio使用技巧,创建自己的代码片段

    1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...

  2. 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App

    0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...

  3. 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App

    0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...

  4. Visual Studio 2017 通过SSH 调试Linux 上.NET Core

    Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Studio 2017 部署环境:Ubuntu ...

  5. Visual Studio 2010无法启动调试

    现象:Visual Studio 2010点击调试或者按F5.Visual Studio 2010没有什么反应,但又不报错. 而点击运行不调试(Ctrl+F5)却没有问题. 解决的方法:打开项目属性, ...

  6. Visual Studio 2012出现“无法访问T-SQL组件和安装了不兼容伯 DacFx版本”的解决办法

    参考:Visual Studio 2012出现“无法访问T-SQL组件和安装了不兼容伯 DacFx版本”的解决办法 Vs2012的下载地址: https://msdn.microsoft.com/en ...

  7. 【转】Visual Studio 非常实用的调试技巧

    下面有从浅入深的6个问题,您可以尝试回答一下 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入 ...

  8. 在Visual Studio中快速启动调试Web应用程序

    原文:http://blog.csdn.net/effun/article/details/2638535 到2005,Visual Studio在启动调试的功能上进行了一些改善,不过因为只是简单的一 ...

  9. 开发者说 | 使用Visual Studio Code编译、调试Apollo项目

    转载地址:https://mp.weixin.qq.com/s?__biz=MzI1NjkxOTMyNQ==&mid=2247484266&idx=1&sn=d6bcd4842 ...

  10. VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能

    出处: https://msdn.microsoft.com/zh-cn/magazine/dn973013(en-us).aspx 很多开发商花了绝大多数时间获取应用程序才干正常发挥作用.更少的时间 ...

随机推荐

  1. E.164 Format

    From http://en.wikipedia.org/wiki/E.164 E.164 is an ITU-T recommendation, titled The international p ...

  2. Jquery UI dialog 传参

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3519318.html] $("#dialog").dialog({ aut ...

  3. 《鸟哥的Linux私房菜》读书笔记一

    1.CPU为一个具有特定功能的芯片,里面含有微指令集,一个CPU又可以分为两个主要的单元:算术逻辑单元和控制单元.CPU读取的数据都是从内存读取来的,内存内的数据是从输入单元传输来的.CPU处理完也要 ...

  4. Oracle的常见错误及解决办法

    ORA-12528: TNS:listener: all appropriate instances are blocking new connections ORA-12528问题是因为监听中的服务 ...

  5. Activity的启动过程

    详见: http://www.cloudchou.com/android/post-805.html

  6. BlockingQueue-线程的阻塞队列

    BlockingQueue作为线程容器,可以为线程同步提供有力的保障,其主要用到的方法包括: add(E o); //将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 ...

  7. [转]笔记本Ubuntu系统关闭独显+省电降温设置

    [转载者按]最近装了Ubuntu 13.04 64 bits版操作系统玩玩,但是发现两个显卡都开着,所以上网查找资料,以在不需要3D的时候关闭Nvidia显卡.通过Bumblebee软件包可以达到这一 ...

  8. java List遍历的方法

    List可以用序号来遍历,但通常推荐使用iterator来遍历Iterator itr = list.iterator();while (itr.hasNext()) { Object nextObj ...

  9. (转)Ubuntu下彻底卸载mysql

    感谢原作者,文章内容很实用.原文链接:http://www.blogjava.net/yjhmily/articles/336926.html ============================ ...

  10. devi into python 笔记(四)python的类

    import 与 from ... import ...: #types只是一个包,FunctionType只是这个包里的一个函数.这里用它来演示 import types #如果要用Function ...