2009-08-08 110 views
0

如果我在方法的开始处添加1行,如果我在第一行通过Visual Studio设置断点,它会指向第一行还是第二行?如果它会标记错误的行,那么编辑.exe文件时我们可以做些什么来确保稍后进行常规调试会话?如果我们在IL代码中添加行并为我们的程序添加断点,会发生什么?

是不是有没有像设置行x是Y?我记得在某处看到类似的东西,不知道.NET是否相关。

+4

你为什么不试试看看? – Christopher 2009-08-08 00:37:00

回答

3

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

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

+0

感谢您的回答。我正在使用Cecil,偶尔你能指出我如何通过它来修改调试符号吗? – 2009-08-08 01:07:50

+0

查看常见问题解答:http://www.mono-project.com/Cecil:FAQ从我记忆中可以看出,装配工也可以加载PDB文件,在这种情况下,我认为它会自动进行修改。 – 2009-08-08 22:48:11

2

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

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

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

+0

我知道没有直接的对应关系。我想要做的只是“忽略”我编译的exe文件上的代码。这是,如果我在方法的开始处插入10条IL行,我希望调试器将第11行看作第一行。 – 2009-08-08 02:12:09

+0

您可能需要使用生成的代码进行一些操作,以便于实现。例如,如果注入的IL可以在包装方法中,那么可以通过使用诸如DebuggerStepThroughAttribute,DebuggerNonUserCodeAttribute或DebuggerHiddenAttribute等属性来告诉调试器忽略它。 (查看文档中的行为细微差别)。 – Addys 2009-08-10 08:29:56

+0

我也给答案本身添加了建议 – Addys 2009-08-10 08:31:19

1

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

0

你如何添加IL?如果你通过分析器工具(SetILFunctionBody)来完成这个工作,那么你还需要提供一个新的IL代码映射(SetILInstrumentationCodeMap),以便调试器知道IL修改。

+0

我正在通过cecil – 2009-08-08 21:26:08

相关问题