我一直不明白堆栈跟踪中的行号是如何与原始源代码相匹配的。堆栈跟踪通常以类似于
C:\Path\Source.cs:123行。
但是,行号经常偏离不少。有谁知道如何正确地将行号与原始源代码的行号相匹配?
发布版的堆栈跟踪可能与源代码不同,因为编译器可能会优化代码,删除行,甚至内联整个方法。在调试版本中,大部分优化都被取消了,堆栈痕迹应该更准确。
一种处理方法是在方法开始时验证参数,并抛出适当的异常,并在消息中包含必要的细节,以便更好地了解出了什么问题。
edit:同时检查pdb文件是否与源文件和dlls匹配。pdb文件包含了从IL代码到源代码的映射,所以在堆栈跟踪中需要行号。
但是,行号经常会有相当大的偏差。
不,它不是。如果是的话,那就是你对源代码进行了修改。显然,行号指的是编译后的源代码,而不是当前的源代码。基本上:使用一个版本控制系统,并对你的版本进行编号。它们确实是一致的。