Mono.Cecil 抛出 SymbolsNotMatchingException,如何找出 Method 行号?

逆向工程 调试 调试器 C# 例外 数据库
2021-07-09 10:44:55

我尝试使用PDB文件将指令映射到 Mono.Cecil 中的序列点并找出方法的行号。但是任何论坛中的答案似乎都不起作用,因为无论我尝试什么,都会抛出SymbolsNotMatchingException并显示错误消息

找到符号但与程序集不匹配”。

顺便说一下,我的目标“应用程序”是一个 Unity 游戏。

这是我使用的一些代码(旁注:ProjectPath 是我的目标路径*.dll):

var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(GetDLLsFolderToResolve(ProjectPath));

using var assembly = AssemblyDefinition.ReadAssembly(ProjectPath,
                new ReaderParameters { ReadWrite = true, AssemblyResolver = resolver, 
                    SymbolReaderProvider = new PdbReaderProvider(), ReadSymbols = true });

我已经在Mono.Cecil.dllMono.Cecil.Pdb.dll同一个文件夹,由于通过的NuGet导入Mono.Cecil能做到。此外,目标 DLL 和 PDB 也位于同一文件夹中。

有人有工作示例吗?或者知道如何解决这个错误?很乐意提供任何帮助。

1个回答

因此,上述所有步骤均按照描述的方式正确。我唯一做错的是,我的目标DLL之前被Mono.Cecil修改过(我已经读过并写过我的目标DLL并通过这种方式修改了它)。因此DLLPDB不再相同。

因此,如果您只想运行 Mono.Cecil 并且遇到上述异常,请执行以下操作:

  1. 再次构建您的目标应用程序(它应该具有所有 DLL 和每个 DLL 的相应 PDB)
  2. 添加ReadSymbols = true到 ReadParameters(在我的情况下我不想写,所以我只需要 ReadParameters)
  3. 运行 Mono.Cecil 应用程序

注意:如果您想运行 Mono.Cecil 一次,这只是一个解决方案。如果要在目标DLL 上再次运行它,则必须再次执行上述所有步骤。

希望这会帮助某人!

~素兰