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

如何配置WinDbg/ADPlus自动捕获特定IIS应用池w3wp崩溃转储

自动捕获特定IIS应用池w3wp二级异常转储的两种方案

我来分享两个靠谱的解决方案,帮你搞定IIS应用池w3wp进程崩溃时自动捕获转储的问题,不用每次手动操作调试工具:

方案一:WinDbg自动附加并捕获异常转储

要让WinDbg自动追踪特定应用池的w3wp进程,不管它重启多少次都能自动附加并捕获二级异常,你可以用PowerShell脚本实现进程监控:

  1. 先定位目标应用池
    打开命令提示符,运行以下命令获取所有w3wp进程对应的应用池信息:

    appcmd list wp
    

    输出会类似:WP "1234" (applicationPool:MyTargetPool),记下你的目标应用池名称(比如MyTargetPool)。

  2. 编写监控脚本
    创建一个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
    }
    
  3. 运行脚本
    以管理员身份打开PowerShell,执行脚本:

    .\AutoAttachWinDbg.ps1
    

    脚本会持续监控目标应用池的w3wp进程,每次进程启动时自动用WinDbg附加,并设置好二级异常触发时自动生成完整转储。

方案二:用ADPlus.exe自动捕获崩溃转储

ADPlus是Debug Tools for Windows自带的工具,专门用于自动捕获进程崩溃转储,我们可以通过脚本让它持续监控特定应用池的w3wp进程:

  1. 编写批处理监控脚本
    创建一个批处理文件(比如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
    
  2. 运行批处理
    以管理员身份打开命令提示符,执行批处理:

    AutoADPlus.bat
    

    脚本会循环检查目标应用池的w3wp进程,一旦发现进程启动,就启动ADPlus监控;当进程因二级异常崩溃时,ADPlus会自动生成完整转储,然后退出,脚本回到循环等待下一次进程启动。

通用注意事项

  • 确保你已经安装了Windows调试工具(WinDbg和ADPlus都包含在里面),路径要对应你的实际安装位置。
  • 转储目录需要有足够的写入权限,建议给IIS应用池账户、运行脚本的账户添加写入权限。
  • 如果需要加载私有符号,可以在WinDbg的命令里添加.sympath+ "C:\YourPrivateSymbolsPath",或者在ADPlus的配置文件里指定符号路径。

内容的提问来源于stack exchange,提问作者A.Pet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:47