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

.NET 6中StackTrace在智能感知显示行号但日志中缺失的问题

问题原因分析

这种差异的核心在于**.NET调试器展示的栈跟踪信息,和Exception.StackTrace属性存储的字符串,来源完全不同**:

  • 当你在调试器中查看完整的异常对象(包括即时窗口查看ex.InnerException),调试器会主动从当前进程的调试上下文(结合PDB符号文件)中,直接解析线程的栈帧信息,生成包含文件路径、行号的完整栈跟踪——这个过程不依赖StackTrace属性的现有值,是调试器实时获取的。
  • 而直接访问ex.InnerException.StackTrace属性时,你拿到的是异常对象被抛出/捕获时,已经生成并存储在属性里的字符串。这个字符串的内容取决于异常被处理的时机和方式:

针对你提到的Caliburn.Micro Coroutine场景,具体原因可能是:

  • Caliburn.Micro的Coroutine机制通常通过异步调度、反射或动态代理执行代码,当异常被捕获并触发Coroutine.Completed事件时,异常的StackTrace属性可能已经被截断,或者在异常包装/传递过程中,没有保留带行号的完整栈信息。
  • 另外,.NET中如果异常是被重新抛出(比如使用throw ex;而非throw;),会重置StackTrace属性,丢失原始的行号信息——Caliburn.Micro的内部异常处理逻辑可能存在这种情况。
解决日志记录行号的办法

如果需要在日志中保留行号,不要直接使用StackTrace属性,而是可以通过以下方法:

  • 使用System.Diagnostics.StackTrace类,传入异常对象并启用捕获文件信息:
    var stackTrace = new System.Diagnostics.StackTrace(ex.InnerException, true);
    string fullStackTraceWithLines = stackTrace.ToString();
    
    这个方法会直接从PDB中读取行号信息,生成包含文件路径和行号的完整栈跟踪字符串。
  • 确保你的项目在编译时生成了完整的PDB(调试模式下默认是完整PDB,发布模式如果需要行号可以设置为full而非pdb-only)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:33:24