如何配置WinDbg/ADPlus自动捕获特定IIS应用池w3wp崩溃转储
自动捕获特定IIS应用池w3wp二级异常转储的两种方案
我来分享两个靠谱的解决方案,帮你搞定IIS应用池w3wp进程崩溃时自动捕获转储的问题,不用每次手动操作调试工具:
方案一:WinDbg自动附加并捕获异常转储
要让WinDbg自动追踪特定应用池的w3wp进程,不管它重启多少次都能自动附加并捕获二级异常,你可以用PowerShell脚本实现进程监控:
先定位目标应用池
打开命令提示符,运行以下命令获取所有w3wp进程对应的应用池信息:appcmd list wp输出会类似:
WP "1234" (applicationPool:MyTargetPool),记下你的目标应用池名称(比如MyTargetPool)。编写监控脚本
创建一个PowerShell脚本(比如AutoAttachWinDbg.ps1),内容如下:# 配置参数 $targetPoolName = "MyTargetPool" # 替换成你的应用池名称 $windbgPath = "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" # 替换成你的WinDbg路径 $dumpDir = "C:\Dumps" # 转储文件保存目录 # 创建转储目录(如果不存在) if (-not (Test-Path $dumpDir)) { New-Item -ItemType Directory -Path $dumpDir | Out-Null } Write-Host "开始监控目标应用池: $targetPoolName" while ($true) { # 查询目标应用池对应的w3wp进程 $wpEntry = & appcmd list wp | Where-Object { $_ -match $targetPoolName } if ($wpEntry) { # 提取进程PID $pid = ($wpEntry -split '"')[1] Write-Host "发现目标进程,PID: $pid" # 检查WinDbg是否已附加到该进程 $windbgAttached = Get-Process windbg -ErrorAction SilentlyContinue | Where-Object { $_.CommandLine -match "-p $pid" } if (-not $windbgAttached) { Write-Host "启动WinDbg并附加到PID: $pid" # 启动WinDbg,设置自动捕获二级SEH异常并生成完整转储 $windbgArgs = "-p $pid -c `".symfix; .reload; sxe -c `.dump /ma $dumpDir\w3wp_crash_$(Get-Date -Format 'yyyyMMdd_HHmmss').dmp`" seh`"" Start-Process -FilePath $windbgPath -ArgumentList $windbgArgs } } # 每隔5秒检查一次 Start-Sleep -Seconds 5 }运行脚本
以管理员身份打开PowerShell,执行脚本:.\AutoAttachWinDbg.ps1脚本会持续监控目标应用池的w3wp进程,每次进程启动时自动用WinDbg附加,并设置好二级异常触发时自动生成完整转储。
方案二:用ADPlus.exe自动捕获崩溃转储
ADPlus是Debug Tools for Windows自带的工具,专门用于自动捕获进程崩溃转储,我们可以通过脚本让它持续监控特定应用池的w3wp进程:
编写批处理监控脚本
创建一个批处理文件(比如AutoADPlus.bat),内容如下:@echo off setlocal enabledelayedexpansion :: 配置参数 set "targetPool=MyTargetPool" # 替换成你的应用池名称 set "adplusPath=C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\adplus.exe" # 替换成你的ADPlus路径 set "dumpDir=C:\Dumps" # 转储文件保存目录 :: 创建转储目录(如果不存在) if not exist "%dumpDir%" mkdir "%dumpDir%" echo 开始监控目标应用池: %targetPool% :loop :: 查找目标应用池对应的w3wp进程PID set "pid=" for /f "tokens=2 delims= " %%a in ('appcmd list wp ^| findstr /i "%targetPool%"') do ( set "pid=%%a" ) if defined pid ( echo 发现目标进程,PID: !pid! echo 启动ADPlus监控崩溃转储 :: 启动ADPlus的crash模式,捕获二级异常并生成转储,进程崩溃后ADPlus自动退出 "%adplusPath%" -crash -p !pid! -o "%dumpDir%" -quiet echo ADPlus已退出,等待下一次进程启动... ) else ( echo 未找到目标进程,等待5秒重试... timeout /t 5 /nobreak >nul ) goto loop运行批处理
以管理员身份打开命令提示符,执行批处理:AutoADPlus.bat脚本会循环检查目标应用池的w3wp进程,一旦发现进程启动,就启动ADPlus监控;当进程因二级异常崩溃时,ADPlus会自动生成完整转储,然后退出,脚本回到循环等待下一次进程启动。
通用注意事项
- 确保你已经安装了Windows调试工具(WinDbg和ADPlus都包含在里面),路径要对应你的实际安装位置。
- 转储目录需要有足够的写入权限,建议给IIS应用池账户、运行脚本的账户添加写入权限。
- 如果需要加载私有符号,可以在WinDbg的命令里添加
.sympath+ "C:\YourPrivateSymbolsPath",或者在ADPlus的配置文件里指定符号路径。
内容的提问来源于stack exchange,提问作者A.Pet
相关产品推荐
相关产品推荐

