无需编译安卓源码进行调试-如何在没有源代码的情况下进行调试。 .NET 程序

在.Net开发过程中,经常使用一些没有源代码的第三方库,如果代码有问题,如果怀疑与库的内部实现有关,我们该怎么办?首先,自然会想到反编译查看代码或联系作者,但是有没有办法让我们在调试时进入这个第三方库,看看运行时会发生什么?本文将介绍三种调试第三方库的方法,希望对您有所帮助。

我们先介绍一下我们的示例代码,下面的代码比较简单,主要功能是:从文本.csv文件中读取每一行数据,并在控制台中显示。CsvConfiguration、CsvReader 和 CsvDataReader 中使用的类来自第三方库 CsvHelper,可以通过 Nuget 下载,假设我们要调试 CsvDataReader 类的读取技术。有关完整的代码工程,请参阅:

    internal class Program
    {
        private static void Main(string[] args)
        {
            using (var textReader = new StreamReader(@".test.csv"))
            {
                var config = new CsvConfiguration(CultureInfo.InvariantCulture)
                {
                    HasHeaderRecord = false
                };
                var csvReader = new CsvReader(textReader, config);
                var csvDataReader = new CsvDataReader(csvReader);
                while (csvDataReader.Read())
                {
                    for (int i = 0; i < csvDataReader.FieldCount; i++)
                    {
                        Console.Write(csvDataReader.GetString(i) + " ");
                    }
                    Console.WriteLine(" ");
                }
            }
            Console.Read();
        }
    }

方法一使用dnSpydnSpy

建立在ILSpy之上,开源免费,不仅可以反编译代码还可以调试,有关dnSpy的更多信息请访问:,让我们来看看具体的操作。下载dnSpy

并根据目标程序是64位还是32位打开dnSpy。本示例中,由于目标程序是 32 位,打开 32 位 dnSpy 即可使用 dnSpy 打开 CsvHelper dll,找到 CsvDataReader 类的 Read 方法,点击侧面设置调试断点,如下图所示:

编译安卓源码要多久_无需编译安卓源码进行调试_调试android源码

在菜单栏中,选择“调试 - >启动调试”或 F5 打开要调试的 exe,如下图所示,然后单击“确定”开始调试

程序会在第二步的断点处手动停止,接下来的调试工作基本和VS中一样,包括快捷键,如下图所示

综上所述,dnSpy功能非常强大,对于.net的系统库也是可以的,所以调试是无忧的。此外,dnSpy可以附加到正在运行的进程,但由于JIT的优化,这些方法可能很难获得所需的信息。关于编译优化和运行时优化,我们稍后再说。

方法 2 使用 dotPeek + Visual Studio

Visual Studio不需要介绍,dotPeek是著名的JetBrains的免费工具,可在:下载。此方法的基本思想是使用 dotPeek 作为 VS 的符号服务器,以下是使用它的方法:

根据目标程序是 64 位还是 32 位,打开相应的 dotPeek,此示例为 32 位,因此使用 dotPeek

打开 32 位 dotPeek 以打开 CsvHelper dll,然后单击工具栏中的“启动符号服务器”按钮以打开符号服务器,如下所示

如果

第一次打开符号服务器,会弹出下面的配置框,请根据自己的情况选择,笔者选择了“所有程序集”,如果以后想更改,可以在工具->选项->符号服务器中进行更改

调试android源码_无需编译安卓源码进行调试_编译安卓源码要多久

现在您可以开始配置 VS,通过 VS 中的工具>选项打开选项配置窗口,在调试/常规下,取消选中“仅启用我的代码”并选中“在模块加载时禁止 JIT 优化”,如下所示

设置 VS 的符号服务器,返回到 dotPeek,打开“工具”-“>选项符号服务器”无需编译安卓源码进行调试,复制地址,然后在 Visual Studio 的工具->选项调试符号中添加新地址,看到右图。

现在,你

可以在VS中正常调试,但是第一次需要生成和加载pdb文件时,可能会很慢。作者的测试效果图如下:

总之,这种方法的优点是能够使用熟悉的VS

方法三:锐化器

Resharper也是JetBrains的付费产品无需编译安卓源码进行调试,使用起来也非常方便,请查看以下步骤:

安装锐化器后,锐化器

将充当 VS 的扩展,首先确保启用锐化器:首先使用 VS 启动调试,打开调试>Windows->模块,然后继续调试,直到 CsvHelper 程序集加载

右键点击 CsvHelper 程序集,选择“使用 ReSharper 反编译器加载符号”,加载符号后即可正常调试,可以通过 F11 单步进入 Read 方法内部,这里有一些相关截图

总之,这种方法可以使用 VS,但 Resharper 插件可能会减慢 VS

源代码和机器指令代码

源代码是

程序员写的代码,这里就不用多说了,先说一个helloword代码,这是源码

首先我们需要知道,无论是Java、C、Python还是其他编程语言JAVA实现编译器源码,对于计算机硬件(CPU),我们需要执行逻辑(比如输出某个段落,执行某个操作),所有这些都必须转换为机器可以识别的机器指令代码并交给CUP执行

我们都知道JVM虚拟机是程序员和计算机硬件的翻译。就是把程序员能读懂的源码翻译过来,再做成机器能看懂的机器码,最后执行

让我们来看看翻译后的机器码:显然一条接一条指令

源代码编译器_JAVA实现编译器源码_源码编译deb

编译

那么对于Java来说,JVM如何将我们编写的代码转化为CPU执行的指令呢?它做三件事:

1、源代码是通过编译工具对代码进行分析处理等一系列操作后生成的,这就是我们都知道的Java C.class

2.编译完成后,需要翻译,这里有两种可能:

源码编译deb_源代码编译器_JAVA实现编译器源码

(1)对于通常的代码,JVM使用Java类库,即Java,将.class文件逐行转换为机器代码(

2)对于热代码(即多次执行的同一段代码,如循环执行10000次),JVM会选择JIT类库(just-in-timecompler-just-time编译器)。JIT类库是将整个热点代码块翻译成机器码并存储起来,存储的机器码在最后一次执行后可以直接交给CPU。

3.将翻译后的机器码交给CPU执行并完成我们需要的操作逻辑

对于前面的过程,可以发现 JIT 类库和 java 类库都是 JVM 类库,至于何时分配使用,则默认由 JVM 决定。但是他们的角色和他们的操作逻辑之间存在差异

对于 Java 协程,可以理解为我将解释一行代码,无论它是否已执行

对于 JIT 协程,可以理解为 JVM 会先估算,选择一些热代码,然后交给我,我先翻译这段代码再保存,上次执行的时候就不用再翻译了,效率提升了

两个库中哪个更快?

在翻译时,Java 协程实际上更快,因为它一次只解释一行

对于执行,JIT 实际上更快,因为它翻译一次,然后就不需要再次翻译了

JIT太厉害了,为什么要使用java库?虽然很简单,但首先不是每一行代码都是热码,其次,JIT翻译比Java协程慢JAVA实现编译器源码,最后存储也需要内存

AOTA时间头预编译

就是直接把java源码编译成机器码,乍一看我觉得老牛X,这个不需要类编译,看起来很厉害

虽然不是,但首先,AOT 的核心思想是 Ahead 预编译,这意味着程序在运行之前很久就被编译了。对于程序来说,执行的代码、参数等都是动态的,随时根据业务变化。您一开始就为我完成了编译,我该如何做我的动态资源和代码?此外,编译速度很慢。所以我的理解是,这个东西适合一些固定的初始化代码,或者解决JIT的编译成本