You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP未处理异常StackTrace属性的异常行为及行号获取问题

UWP未处理异常StackTrace行号不一致问题解答

问题场景

在UWP应用的App.xaml.cs中编写了以下代码,用于捕获未处理异常并输出堆栈跟踪到调试窗口:

private void OnAppUnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e)
{
    Exception exceptionThatDoesntGoAway = e.Exception;

    string stackTrace = exceptionThatDoesntGoAway.StackTrace;

    Debug.WriteLine("Exception Stacktrace: " + stackTrace);

    e.Handled = true;
}

为避免多次访问异常导致内容被清除,已将异常保存到独立变量中,但发现两个现象:

  • 在Visual Studio监视窗口中查看exceptionThatDoesntGoAway的StackTrace属性时,包含应用文件的正确行号
  • 直接通过代码访问exceptionThatDoesntGoAway.StackTrace时,返回的属性值缺失应用文件的行号

问题解答

1. 同一属性值差异的原因

Visual Studio监视窗口获取堆栈跟踪时,是通过调试器直接从进程内存中提取原始调试信息,不会触发Exception.StackTrace属性的内部逻辑。而代码中访问该属性时,UWP运行时会生成经过简化的堆栈跟踪——默认情况下,出于性能和安全考虑,UWP会隐藏应用程序代码的行号,只保留框架层的调用信息。

2. 获取带正确行号的StackTrace的方法

要获取包含应用代码行号的堆栈跟踪,需要使用System.Diagnostics.StackTrace类手动生成,而非直接访问异常的StackTrace属性:

private void OnAppUnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e)
{
    Exception exceptionThatDoesntGoAway = e.Exception;
    // 传入异常实例并启用行号捕获
    var stackTrace = new System.Diagnostics.StackTrace(exceptionThatDoesntGoAway, true);
    string fullStackTrace = stackTrace.ToString();
    Debug.WriteLine("Exception Stacktrace with line numbers: " + fullStackTrace);
    e.Handled = true;
}

额外注意:

  • 确保项目调试符号已正确生成:在项目属性的“生成”选项卡中,将“调试信息”设置为“完整”或“pdb-only”
  • 仅在调试模式下,或部署带有pdb符号包的版本时,才能获取到行号;发布模式下若剥离了符号,仍无法获取

3. 是否属于预期行为

这是UWP运行时的预期行为。直接访问Exception.StackTrace返回的是经过优化的堆栈信息,目的是减少运行时开销,同时避免在生产环境暴露过多代码细节。而调试器能看到完整行号,是因为它绕过了运行时的属性逻辑,直接读取调试符号文件中的信息。

内容的提问来源于stack exchange,提问作者Gabboxl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 22:32:21