如何访问和使用堆栈跟踪来帮助识别错误

时间:2017-02-09 17:53:19

标签: vb.net visual-studio

我看到很多人发帖说他们得到了这样的错误,但似乎根本不知道如何找出错误的来源。

因此我想知道人们是否知道如何访问和使用堆栈跟踪。

那么你如何访问它,它对你意味着什么呢?

2 个答案:

答案 0 :(得分:5)

当您收到如下所示的错误消息时,请点击查看详细信息.. 链接。

Error Report

这将打开此属性框。

展开异常以显示详细信息并将鼠标悬停在StackTrace属性上。

Error Details

你看到的大部分内容都可能是希腊语(向希腊朋友致歉),但如果你仔细观察,你会看到说明的行

  

at“NAME OF A MODULE”:第230行(或任何地方)

跟踪中的第一行是最终崩溃代码的行。只需在代码中找到该行并尝试找出该特定行导致指定错误的原因。

该格式的后续行是代码中从上面调用上面列出的例程的点。

现在上面的图像不是一个很好的例子,因为IDE调试器在错误行停止了。但无论如何,当您在try / catch语句中正确捕获错误时,堆栈跟踪非常有用。异常的一个属性是stack-trace ..查看它或将其转储到即时窗口。

    Try

    Catch ex As Exception
        Debug.Print(ex.StackTrace)
    End Try

此外,在运行exe版本时,请熟悉详细信息窗格。它的堆栈跟踪相同。

enter image description here

答案 1 :(得分:1)

错误的堆栈跟踪可以通过任何异常的StackTrace property作为字符串进行访问。主要是你从Try/Catch statement中捕获的异常中获取它,但你也可以通过AppDomain.UnhandledException event从未处理的异常中获取它:

'Somewhere in your code, preferrably at startup.
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomain_UnhandledException

'The event handler.
Private Sub AppDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
    Dim ex As Exception = DirectCast(e.ExceptionObject, Exception) 'Cast the ExceptionObject into an Exception.
    MessageBox.Show("An unhandled exception occurred. Stack Trace:" & Environment.NewLine & ex.StackTrace)
End Sub

Stack Trace告诉您发生异常的位置以及调用哪些方法以达到该点。如果您在自己的机器上进行调试,堆栈跟踪还将显示调用的文件名和行号。

Stack Trace的一个例子可能是:

at MyProject.CustomClass.PerformActions(Int32 ID) in C:\Projects\MyProject\CustomClass.vb:line 12
at MyProject.MainForm.CheckStatus() in C:\Projects\MyProject\MainForm.vb:line 65
at MyProject.MainForm.Button1_Click(Object sender, EventArgs e) at C:\Projects\MyProject\MainForm.vb:line 33

Stack Trace的每一行代表一个在当前调用层次结构中调用的方法。第一行代表最新/当前的方法。

上面的堆栈跟踪示例告诉您错误发生在PerformActions文件的CustomClass.vb方法的第12行。它还显示PerformAction方法调用了MainForm.CheckStatus方法,而{(1}}方法又通过点击Button1来调用(大概)。