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

部署版WPF(C#)应用异常日志如何记录代码行号?

解决ClickOnce部署WPF应用异常行号获取问题

核心原因

分发版无法稳定获取行号,本质是Release模式下默认未包含完整调试符号(.pdb文件),或符号文件未随应用部署,导致CLR无法解析异常堆栈中的代码位置信息。


具体解决步骤

1. 生成并部署调试符号文件

  • 在Visual Studio中打开项目属性,切换到「生成」标签页,点击「高级」按钮:
    • 将「调试信息」设置为 pdb-only(Release模式推荐,不影响运行性能,同时保留行号信息);若需更完整调试信息,可选择「完整」。
  • 配置ClickOnce部署包含.pdb文件:
    • 切换到「发布」标签页,点击「应用程序文件」按钮,找到项目输出的.pdb文件(通常和主.exe同目录),将其「发布状态」改为「包含」,确保符号文件随应用一起部署到用户机器。

2. 优化异常日志捕获逻辑

原代码对堆栈帧的处理存在问题,以下是改进后的实现,能更稳定提取行号:

// 优先监听未处理异常(聚焦崩溃类问题)
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
    if (args.ExceptionObject is Exception ex)
    {
        lt.depositLog(ex, $"UNHANDLED EXCEPTION for {user}", logPath);
    }
};

// 保留FirstChanceException用于追踪所有异常(可选)
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
    lt.depositLog(eventArgs.Exception, $"CATCH ALL EXCEPTION for {user}", logPath);
};

// 改进后的日志写入方法
public void depositLog(Exception exception, string user, string path) 
{ 
    using (StreamWriter w = File.AppendText(path))
    {
        var logContent = new StringBuilder();
        logContent.AppendLine($"{version}{user}~~~~~  Encountered exception: {exception.ToString()}");
        logContent.AppendLine("=== STACK TRACE WITH LINE NUMBERS ===");
        
        var stackTrace = new StackTrace(exception, true);
        foreach (StackFrame frame in stackTrace.GetFrames() ?? Enumerable.Empty<StackFrame>())
        {
            int lineNum = frame.GetFileLineNumber();
            string fileName = frame.GetFileName() is null ? "Unknown File" : Path.GetFileName(frame.GetFileName());
            string methodName = frame.GetMethod()?.ToString() ?? "Unknown Method";
            
            logContent.AppendLine($"Line {lineNum} | {fileName} | {methodName}");
        }
        
        w.WriteLine(logContent.ToString());
        w.WriteLine("====================================");
    }
}

3. 确保符号文件与程序集同目录

ClickOnce部署的应用会被安装到用户本地缓存目录,需保证.pdb文件和主程序集(.exe/.dll)处于同一目录下,CLR才能自动加载符号文件解析行号。

4. 验证发布流程

  • 发布前检查Release输出目录,确认.pdb文件已生成;
  • 将应用发布到测试环境,安装后触发异常,查看日志文件是否正确显示代码行号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:40:26