如果我在方法的开头添加 1 行,如果我在第一行通过 Visual Studio 设置断点,它将指向第一行还是第二行?如果它会标记错误的行,在编辑 .exe 文件时我们可以做些什么来确保以后进行常规调试会话?
有没有类似将线x设置为Y的东西?我记得在某处看到过类似的东西,不确定.NET 是否相关。
如果我在方法的开头添加 1 行,如果我在第一行通过 Visual Studio 设置断点,它将指向第一行还是第二行?如果它会标记错误的行,在编辑 .exe 文件时我们可以做些什么来确保以后进行常规调试会话?
有没有类似将线x设置为Y的东西?我记得在某处看到过类似的东西,不确定.NET 是否相关。
如果您希望调试体验保持不变,则需要更新 PDB 文件中的调试符号。
我见过的最好的选择是使用Mono.Cecil,因为它支持调试符号以及 IL 的(有限)修改。
如果您正在修改 IL,那么 PDB 文件将包含过时的信息。请注意,IL 行与 C# 行#s 的更改之间可能不会存在 1:1 的变化(例如,插入 3 个 IL 语句不会将 IDE 断点偏移 3 行 C#)。
您可能希望将代码的 IL 修改部分分离为单独的方法,以最大程度地减少影响。此外,假设您是进行 IL 修改的人,您可能会发现在调试时在 C# 和 IL 视图之间切换很方便。
您可能需要对生成的代码进行一些处理以促进这一点。例如,如果注入的 IL 可以在包装器方法中,那么您可以通过使用 DebuggerStepThroughAttribute、DebuggerNonUserCodeAttribute 或 DebuggerHiddenAttribute 等属性来告诉调试器忽略它。(查找有关行为细微差别的文档)
我希望您被标记为 .pdb 文件可能不匹配。
你如何添加IL?如果您通过分析器检测 (SetILFunctionBody) 执行此操作,则还需要提供新的 IL 代码映射 (SetILInstrumentationCodeMap) 以便调试器了解 IL 修改。