C# 我可以得到导致异常的代码行吗?

C# 我可以得到导致异常的代码行吗?,c#,exception-handling,C#,Exception Handling,除了从中读取堆栈帧的GetFileName()文件和读取行GetFileLineNumber() new StackTrace(exception).GetFrame(x) 是否有方法获取导致异常的实际代码行(作为字符串) 谢谢我不这么认为。代码已编译,因此不再可用。 但是,如果您也有可用的源代码,可能会有一些变通方法。不,据我所知,这是您唯一的选择。为了获得导致异常的原始代码行,那么就必须有可用的源代码。我想说,通过调试符号(在大多数情况下是PDB文件)已经可以获得行号,这使得它足够简单 您

除了从中读取堆栈帧的
GetFileName()
文件和读取行
GetFileLineNumber()

new StackTrace(exception).GetFrame(x)
是否有方法获取导致异常的实际代码行(作为字符串)


谢谢

我不这么认为。代码已编译,因此不再可用。
但是,如果您也有可用的源代码,可能会有一些变通方法。

不,据我所知,这是您唯一的选择。为了获得导致异常的原始代码行,那么就必须有可用的源代码。我想说,通过调试符号(在大多数情况下是PDB文件)已经可以获得行号,这使得它足够简单


您建议的方法有什么特别的问题吗?

没有可靠的方法可以做到这一点,因为行信息没有存储在DLL文件中。将IL块映射到源代码行的信息存储在PDB文件中。您需要访问PDB以获取异常的行信息

如果PDB可用,有关StackFrame类的信息足以获取适当的ISymUnmanagedMethod类。您主要只需要将方法令牌和当前偏移量输入到方法中。这确实需要您了解PDB的内部结构,我不确定是否在任何地方记录了它


PDB API:

它将被编译,因此在运行时您将只拥有IL。充其量,您可以获取IL并将其反编译回C#,就像reflector一样。

后期调试很困难,但并非不可能。您还可以使用(例如)一些工具。

您可以使用
try catch
块获取行:

catch(Exception exception) {
    //exception.StackTrace at the first line has the line you are looking for
}

关于.pdb调试符号呢?我认为pdb没有这种信息。它太详细了。我只是想知道是否可以通过一些内部机制或其他方式从.pdb中提取if:s,不确定替代方案在哪里,因此问题是:)pdb实际上不包含源代码。(这会使它们膨胀得很厉害,至少是多余的。)是PDB文件告诉你文件名行号(通过调用你提到的StackFrame方法)。关于替代方案,我担心没有。当然,您可以手动解码PDB文件(这将是一项痛苦的任务),但我不确定它会告诉您比StackTrace/StackFrame对象更多的信息。我将如何做到这一点?PDB中有哪些信息?@Andrew PDB中有很多信息。每种语言都倾向于存储一些相同的和一些特定于语言的信息。我不确定行列信息存储在哪里或文档在哪里。否。唯一的方法是找到行号和源文件,如果计算机上存在该文件,则显示该行号和源文件。