上次我们提到,没有源代码而且没有调试符号,我们也可以 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. Keys of HashMap in Java

    The tricky thing is how to decide the key for a hashmap. Especially when you intend to use self-defi ...

  2. NOIP 2011 提高组 计算系数

    有二项式定理 `\left( a+b\right) ^{n}=\sum _{r=0}^{n}\left( \begin{matrix} n\\ r\end{matrix} \right) a^{n-r ...

  3. 李洪强iOS开发Swift篇—04_运算符

    李洪强iOS开发Swift篇—04_运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运 ...

  4. Android开源项目发现---ViewPager 、Gallery 篇(持续更新)

    1. Android-ViewPagerIndicator  鼎鼎大名,配合ViewPager使用的Indicator,支持各种位置和样式 项目地址:https://github.com/JakeWh ...

  5. Android开源项目发现---ActionBar篇(持续更新)

    1. ActionBarSherlock 鼎鼎大名, 为Android所有版本提供统一的ActionBar,解决4.0以下ActionBar的适配问题 项目地址:https://github.com/ ...

  6. eclipse或IDEA连接魅蓝

    1.首先 安装ADB 驱动 http://developer.android.com/tools/device.html 如果没装就自行去下载安装 别的品牌都可以顺利连接,魅族手机特有的原因导至在开发 ...

  7. Perl脚本学习经验(四)--Perl中sftp的使用

    使用sftp,需要使用Except模块,该模块需要下载安装在perl目录下,可以上http://www.cpan.org/上下载对应的安装包:1. 用root用户登录环境:2. cd /usr/lib ...

  8. 【HDOJ】1867 A + B for you again

    KMP算法的应用. #include <stdio.h> #include <string.h> #define MAXNUM 100005 char src[MAXNUM], ...

  9. linux字符图形界面

    /etc/inittab 1)  字符界面标识: id:3:initdefault: 2)  图形界面标识: id:5:initdefault:   [root@ora9i ~]# vi /etc/i ...

  10. C#常见算法题目(面试准备)

    1.写出冒泡,选择,插入排序算法.     //冒泡排序    public class bubblesorter    {        public void sort(int[] list)   ...