【问题标题】:How to decompile pdb to get C# source code?如何反编译 pdb 以获取 C# 源代码?
【发布时间】:2011-09-28 09:30:42
【问题描述】:

我的场景: 我想在日志文件中写入发生异常的代码部分(例如,发生异常的前 5 行和后 5 行 - 或者至少是该方法的所有代码)。

我的想法是在 C# 代码中反编译 pdb 文件,并从该反编译文件中找到一个在 catch 块中出现异常的方法。

Pbd 文件存在,并且我的应用程序构建为调试版本。我知道有一些工具允许通过其 GUI(例如 Reflector)进行反编译,但我想从我的代码中获得该功能。

怎么做?

【问题讨论】:

  • CLR 已使用 .pdb 文件。这就是在异常的 StackTrace 中生成源代码和行号注释的原因。与您在没有 .pdb 文件的情况下获得的堆栈跟踪进行比较,以查看差异。寻找更多是没有意义的,这是可能的。

标签: c# .net logging pdb-files decompiler


【解决方案1】:

PDB 包含 MSIL 和源文件名/行号之间的映射。当您可以返回并查看原始源文件时,这是最有用的,因为反编译通常不会保留行号(尽管如果它也使用 PDB 文件则可以)。它当然不能完全按照所写的方式恢复原始代码,尽管使用符号名称(也存储在 PDB 中)它通常很接近。

【讨论】:

    【解决方案2】:

    查看 ILSpy 的源代码。它是 Reflector 的开源替代品。

    特别是它使用库Mono.CecilMono.Cecil.Pdb。我怀疑后者可以帮助您完成您想做的事情。

    相关代码部分使用 MIT 许可证,这是一种许可许可证。

    【讨论】:

    • 请避免使用ILSpy并使用Reflector,您会为自己省去一些问题。
    • @BartoszWójcik 你能解释一下为什么使用Mono.Cecil.Pdb 不是一个好的选择吗?
    • de4dot 放弃 Mono.Cecil 进行 .NET 操作的原因相同
    • @BartoszWójcik 您如何将 Reflector 嵌入到您的应用程序中以生成扩展的调试信息?它的许可证甚至允许这样做吗?
    【解决方案3】:

    使用反射获取执行方法的源码:System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

    您可以使用 MethodBase 成员获取各种信息:http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

    还可以在这里查看一些在异常处理时获取 MethodBase 信息的好例子:http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

    【讨论】:

    • GetMethodBody() 不允许我查看该方法的源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多