如何在特定异常触发时捕获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是官方诊断工具,支持通过配置规则自动触发转储,适合生产环境自动化监控:
- 创建
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" } } ] } } }
- 启动.NET Monitor:
dotnet monitor collect --configuration settings.json --urls http://*:52323
当应用抛出符合条件的异常时,会自动在指定路径生成全量转储。
关键注意事项
- 全量转储文件体积较大,需提前预留足够磁盘空间;
- 生成转储会短暂暂停进程,负载高峰期建议限制捕获次数;
- 确保诊断工具版本与应用的.NET Runtime版本兼容。
内容的提问来源于stack exchange,提问作者Akhilesh
相关产品推荐
相关产品推荐

