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

如何在特定异常触发时捕获ASP.NET Core进程转储?

负载下HttpContext并发异常的条件触发转储方案

针对你遇到的仅在负载时复现、普通dump无法捕获异常瞬间状态的问题,以下是几种精准触发转储的实用方案:

一、代码层面主动触发转储

在可能抛出目标异常的代码块(或全局异常处理逻辑中),捕获特定条件的异常并生成转储,适合精准定位到某段访问HttpContext属性的场景:

// 以ASP.NET Core为例,通过IHttpContextAccessor获取上下文
private readonly IHttpContextAccessor _httpContextAccessor;

public YourService(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

public void YourMethod()
{
    try
    {
        // 访问你怀疑出问题的HttpContext属性
        var targetValue = _httpContextAccessor.HttpContext.Request.Headers["X-Custom-Header"];
    }
    catch (NullReferenceException ex)
    {
        // 过滤堆栈中包含目标类型/属性的异常
        if (ex.StackTrace?.Contains("HttpContext") == true && ex.StackTrace.Contains("Request.Headers"))
        {
            // 生成全量转储,文件默认输出到进程当前目录
            System.Diagnostics.Process.GetCurrentProcess().Dump();
        }
    }
}

注意:需确保进程有写入权限,负载环境下建议限制转储次数(比如加计数器只捕获前几次异常),避免过度影响性能。

二、系统级工具条件触发转储

Windows环境:使用ProcDump

微软的ProcDump工具可监控进程,当指定异常发生时自动生成转储:

# 监控未处理的NullReferenceException,针对托管进程生成全量转储
procdump -e 1 -f "System.NullReferenceException" -g -ma -w YourAspNetCoreApp.exe

参数说明:

  • -e 1:捕获未处理异常
  • -f:过滤指定异常类型
  • -g:适配.NET托管进程
  • -ma:生成包含全量内存数据的转储
  • -w:等待目标进程启动后再监控

Linux环境:脚本+gcore

通过监控应用日志,匹配目标异常时触发gcore生成转储:

#!/bin/bash
APP_LOG="/var/log/your-app.log"
APP_NAME="YourAspNetCoreApp"

tail -f "$APP_LOG" | while read line; do
    # 匹配包含NullReferenceException和HttpContext的日志行
    if echo "$line" | grep -q "NullReferenceException.*HttpContext"; then
        PID=$(pgrep "$APP_NAME")
        if [ -n "$PID" ]; then
            gcore "$PID"
            echo "Core dump generated for PID $PID at $(date)" >> dump-log.txt
            # 可选:捕获一次后退出脚本,避免重复生成
            break
        fi
    fi
done

三、用.NET Monitor实现规则化触发

.NET Monitor是官方诊断工具,支持通过配置规则自动触发转储,适合生产环境自动化监控:

  1. 创建settings.json配置文件:
{
  "CollectionRules": {
    "HttpContextNullRefDump": {
      "Trigger": "UnhandledException",
      "Filters": [
        {
          "Key": "ExceptionType",
          "Value": "System.NullReferenceException"
        },
        {
          "Key": "ExceptionStackTrace",
          "Value": "HttpContext"
        }
      ],
      "Actions": [
        {
          "Type": "Dump",
          "Settings": {
            "DumpType": "Full",
            "OutputPath": "/var/dumps"
          }
        }
      ]
    }
  }
}
  1. 启动.NET Monitor:
dotnet monitor collect --configuration settings.json --urls http://*:52323

当应用抛出符合条件的异常时,会自动在指定路径生成全量转储。

关键注意事项

  • 全量转储文件体积较大,需提前预留足够磁盘空间;
  • 生成转储会短暂暂停进程,负载高峰期建议限制捕获次数;
  • 确保诊断工具版本与应用的.NET Runtime版本兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:10:26