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
相关产品推荐
相关产品推荐

