C# 发生异常时如何获取IL指令偏移量?

C# 发生异常时如何获取IL指令偏移量?,c#,cil,C#,Cil,我想在异常发生时(从方法开始)获取IL指令偏移量 例如,我有对象初始值设定项: var obj = new SomeObject { F1 = something.A, F2 = something.B, F3 = something.C, F4 = something2.A, F5 = something.D }; 如果something2将null-将抛出异常 异常堆栈跟踪将指向第一行: var obj = new SomeObject { 我可以得到问题对

我想在异常发生时(从方法开始)获取IL指令偏移量

例如,我有对象初始值设定项:

var obj = new SomeObject {
   F1 = something.A,
   F2 = something.B,
   F3 = something.C,
   F4 = something2.A,
   F5 = something.D
};
如果
something2
null
-将抛出异常

异常堆栈跟踪将指向第一行:

var obj = new SomeObject {
我可以得到问题对象的确切IL代码偏移量吗

在本例中,我希望得到此指令的偏移量:

callvirt instance void SomeClass2::get_A(class SomeClass2)

更新:通过PDB发布的答案在这种情况下不起作用,因为行将完全指向同一个位置。

不确定它是否准确地解决了您的问题,但是如果您使用
ildasm
获取程序集的IL列表,那么您可以使用:
ilasm/PDB/DEBUG…
(该程序集在功能上应该与原始程序集等效,但不能完全相同)


这个过程的有趣之处在于,生成的.pdb将IL清单视为“源”,因此只要IDE能够找到.pdb和IL清单,就可以像处理普通C#一样逐条处理IL指令,并且还会看到IL指令上出现异常(甚至对于您的示例中的属性初始值设定项)。

如果您在异常时中断,您可能能够在监视窗口中创建一个对象,将异常传递到其构造函数,并在第一帧调用
GetILOffset()
(类似于
newstacktrace($exception).GetFrame(0).GetILOffset()
IIRC)


话虽如此,JIT最终可能会将该语句生成的所有本机代码映射到同一IL偏移量,在这种情况下,除了分解该语句之外,您无能为力。

如果在异常时中断,您可能能够在监视窗口中创建一个对象,将异常传递到其构造函数并调用
Get第一帧上的ILOffset()
(类似于
newstacktrace($exception).GetFrame(0).GetILOffset()
IIRC)。已经说过JIT可能会将该语句生成的所有本机代码映射到同一IL偏移量,在这种情况下,除了分解该语句之外,您没有什么可以做的。@BrianReichle您的答案真的像我所希望的那样有效!您必须创建一个答案,以便我可以检查它是否正确。哇,这很有帮助!但它无法解决my问题。我的确切问题是,在我无法直接访问的远程服务器上发生异常。所以我想要更好的调试信息。感谢您的回复,我会记住这一点。