如果我们在IL代码中添加行并向程序添加断点会发生什么?

时间:2009-08-08 00:30:22

标签: c# .net vb.net intermediate-language

如果我在方法的开头添加let说1行,如果我在第一行通过Visual Studio设置断点,它会指向第一行还是第二行?如果它会标记错误的行,那么在编辑.exe文件时我们可以做些什么来确保以后的常规调试会话?

是不是像设置x行那样是Y?我记得在某个地方看到类似的东西,不确定.NET是否相关。

4 个答案:

答案 0 :(得分:3)

如果希望调试体验保持不变,则需要更新PDB文件中的调试符号。

我见过的最佳选择是使用Mono.Cecil,因为它支持(有限)修改调试符号以及IL。

答案 1 :(得分:2)

如果要修改IL,则PDB文件将包含过时信息。请注意,IL行与C#行#s的更改之间可能不会有1:1(例如,插入3个IL语句不会将IDE断点偏移3行C#)。

您可能希望将代码的IL修改部分分离为单独的方法,以最大限度地减少影响。另外,假设您正在进行IL修改,您可能会发现在C#和C#之间切换很方便。调试时的IL视图。

您可能需要使用生成的代码进行一些操作才能实现这一点。例如,如果注入的IL可以在包装器方法中,那么您可以告诉调试器通过使用诸如DebuggerStepThroughAttribute,DebuggerNonUserCodeAttribute或DebuggerHiddenAttribute之类的attrbiute来忽略它。 (查看文档中的行为细微差别)

答案 2 :(得分:1)

我希望你被标记为.pdb文件可能不匹配。

答案 3 :(得分:0)

你是如何添加IL的?如果您通过探查器工具(SetILFunctionBody)执行此操作,那么您还需要提供新的IL代码映射(SetILInstrumentationCodeMap),以便调试器了解IL修改。