看起来你可以使用Reflector和Debugger的混合体,即使完全没有源代码也能够调试任何.NET应用程序。这可能吗?有人见过这种情况吗?
我很久以前尝试过这个,但没有成功。由于反射器现在已经有了很大的改进,所以我想今天可能是可能的。
如果你想一想,这实际上有点可怕。有人可以反编译你的应用程序并获得全部代码,然后修改它并分发他们自己的版本。所有这些都不需要开源。但另一方面,“他们”创造混淆器就是为了防止这种事情的发生。
不,你需要属于你要调试的应用程序的符号文件(.PDB)。
Reflector允许你从IL转换为可读的.NET代码,但它仅保持意义而不是开发人员编写的确切代码。因此,即使你有来自Reflector的PDB和源代码,也无法进行匹配调试。
我想你可以使用Reflector的源代码输出创建一个.NET项目并生成自己的版本进行调试。不过那通常会非常麻烦,在.NET Framework的情况下,Microsoft发布了调试信息供任何感兴趣的人使用。
我记得曾经有一个用于在Reflector中进行调试的插件,但我无法使其正常工作。
我以前见过并做过这件事。我用它来向我的老板展示我们的应用程序并没有他想象中那么安全。拿了一个DLL,得到了源代码,然后嘭——他几乎心脏病发作了。
有些情况下,.Net Reflector会出现故障,但很难做到这一点——我知道,因为我已经积极尝试过了。好的混淆器会使代码变得如此难以管理/阅读(例如通过重载“a”函数来执行基于参数的大量不同操作),以至于查看源代码对你没有任何帮助,但你仍然可以进行调试——祝你好运弄清楚发生了什么。
在较大、更复杂的应用程序中,特别是在使用了许多最近的结构(如lambda和初始化器)时,这是可能的,但不是非常实用的(你会得到一堆包含美元符号的变量名,如CS$4$0000,必须手动修复)。即使是简单的switch语句也会导致一些非常丑陋的代码,其中充满了Reflector中的goto语句。
我在将代码反编译为MSIL并在调试模式下重新编译方面取得了更多的成功。然后,您可以在IL文件中放置断点,并在VS中使用所有常规调试器功能。MSIL一开始看起来有点吓人,但您很快就能掌握它。
这篇优秀的文章解释了如何做到这一点: http://www.codeproject.com/KB/dotnet/Debug_Framework_Classes.aspx