如何在StackTrace中获取.NET中抛出的exception中的行号以显示
MSDN说这是关于Exception
类的StackTrace
属性:
StackTrace属性包含堆栈跟踪,您可以使用它来确定错误发生在代码中的何处。 StackTrace列出了exception之前的所有被调用方法以及进行调用的源中的行号。
所以我知道这些信息是可用的。 如何获得实际显示在堆栈跟踪中的行号? 我的代码在一个非常困难和复杂的代码片段中抛出一个exception,它通过TONS的对象,所以我不想经过几十年的时间来查看exception发生的位置。 exception的堆栈跟踪仅显示方法签名而不显示行号。
要获取StackTrace中的行号,您需要在dll / exes旁边拥有正确的调试信息(PDB文件)。 要生成调试信息,请在Project Properties -> Build -> Advanced -> Debug Info
设置选项:
将其设置为full
应该足够(请参阅高级构建设置对话框文档 ,了解其他选项的用途)。 默认情况下会为Debug构建配置生成调试信息(即PDB文件),但也可以为Release构建配置生成调试信息(即PDB文件)。
为发布版本生成PDB使您可以在没有PDB的情况下发送代码,但是如果需要行号(甚至连接远程调试器),则将PDB放在dll旁边。 需要注意的一点是,在发布版本中,由于编译器或JIT编译器的优化,行号可能不完全正确(如果行号显示为0,则尤其如此)。
您必须在启用了pdb文件的情况下构建项目,并确保使用您的应用程序部署pdb文件。 您可以通过右键单击需要pdb文件的程序集来检查pdb文件是否实际上是为您配置的,然后转到Properties> Build> Advanced并确保在Output Debug Info下设置为full。
如果您有使用VS2012或更高版本的Web应用程序或Web服务项目,则更改构建设置将不起作用。 相反,您应该遵循本文中的建议:
Visual Studio 2012网站发布不复制.pdb文件
具体来说,您应该在中包含以下设置
\Properties\PublishProfiles\*.pubxml
您项目的文件:
False
鉴于程序集有一个pdb文件,您可以尝试以下操作:
try { throw new Exception(); } catch (Exception ex) { // Get line number from the stack trace's top frame for the exception with source file information int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber(); }
除了其他伟大的建议,我们正在部署到IIS。 我们有一个临时服务器和一个生产服务器。 它们看起来完全相同,除了分期给我们行号而生产没有。 事实certificate,生产的bin目录中有一个额外的DLL(它恰好是SqlServerSpatial.dll fwiw),一旦它被移动到系统目录,行号开始出现在生产中。
我们的教训是确保生产的bin目录在各方面都与开发的bin目录相匹配(XML文件除外)。
似乎找到了解决方案。 至少在VS2010上,输出调试信息设置为完全,我也没有在exception中获得行号。 似乎是在编辑器中打开行号。 (工具 – >选项 – >文本编辑器 – >所有语言 – >常规 – >显示 – >行号)
现在exception显示行号。
- 无论如何在C#中缓存函数/方法
- WinRT – MessageDialog.ShowAsync将在我的自定义类中抛出UnauthorizedAccessException
- ASP.NET使用SqlConnection连接MySQL
- 使用IEnumerable和IQueryable作为一种ObjectSet时的差异
- .Net 4.0 System.Web.Security.MembershipProvider含糊不清的参考?
- SmtpException:仅为具有ASCII本地部分的电子邮件地址配置客户端或服务器
- Html Agility Pack循环遍历表行和列
- WCF从客户端向服务器发送int
- IEnumerable 到Stream for FileStreamResult