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

IIS下php-cgi.exe崩溃:如何定位崩溃时运行的PHP代码

定位PHP-CGI.exe崩溃对应的PHP代码位置(Windows Server 2019 + IIS + PHP 8.3.12 NTS)

问题背景

环境:Windows Server 2019 + IIS + PHP 8.3.12.0 NTS
症状:php-cgi.exe偶尔崩溃,Windows应用程序事件日志报错如下:

Faulting application name: php-cgi.exe, version: 8.3.12.0, time stamp: 0x66f31faa
Faulting module name: ntdll.dll, version: 10.0.17763.6414, time stamp: 0xd2a47020
Exception code: 0xc0000409
Fault offset: 0x00000000000a4fb0
Faulting process id: 0xc78
Faulting application start time: 0x01db3dcdd7800477
Faulting application path: C:\php\php8312nts\php-cgi.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 80de4dc0-2c5c-4d6d-8b18-17238bd88a77
Faulting package full name:
Faulting package-relative application ID:

查看崩溃转储文件report.wer后,发现故障关联已卸载的Sybase ASE ODBC驱动模块sybdrvodb64.dll_unloaded,但该驱动被大量脚本调用,无法定位具体触发崩溃的PHP代码,且同一时间点PHP错误日志无相关记录。


解决方法

方法1:通过调试工具解析崩溃转储,定位PHP代码行

  1. 配置PHP生成可调试的崩溃转储

    • 编辑php.ini,确保基础错误日志开启:
      log_errors = On
      error_log = "C:\php\logs\php_error.log"
      error_reporting = E_ALL
      display_errors = Off
      
    • 添加系统环境变量PHP_DUMPABLE=1,重启IIS和PHP-CGI进程,确保崩溃时生成完整转储文件。
  2. 安装Windows调试工具

    • 从Windows SDK安装「Windows调试工具」,启动WinDbg Preview。
  3. 分析崩溃转储

    • 打开WinDbg,加载崩溃转储文件(默认路径:C:\ProgramData\Microsoft\Windows\WER\ReportArchive)。
    • 执行命令.symfix自动加载微软符号服务器的符号文件,再执行!analyze -v生成详细崩溃报告。
    • 若报告中出现sybdrvodb64.dll或php_odbc.dll的调用栈,执行k命令查看完整调用链,再用!phpstack命令(需PHP官方提供的调试符号)解析出对应的PHP文件路径和行号。

方法2:通过日志追踪可疑请求

  1. 开启PHP慢日志

    • 编辑php.ini,添加慢日志配置:
      slowlog = "C:\php\logs\php_slow.log"
      request_slowlog_timeout = 1 ; 可根据实际调整超时阈值,单位秒
      
    • 重启IIS后,慢日志会记录执行超时的请求,结合崩溃时间点排查可疑脚本。
  2. 启用IIS失败请求跟踪

    • 在IIS管理器中找到对应站点,开启「失败请求跟踪规则」,设置跟踪条件为「状态代码=500」或「时间限制超过X秒」。
    • 崩溃发生后,查看C:\inetpub\logs\FailedReqLogFiles下的跟踪日志,获取对应时间点的请求URL、PHP文件路径及执行阶段。

方法3:分批隔离排查ODBC调用场景

  • 临时分批禁用使用Sybase ODBC驱动的脚本模块,观察崩溃是否停止,逐步缩小范围到具体触发崩溃的脚本。

补充提示

  • 异常代码0xc0000409属于栈溢出/缓冲区溢出错误,大概率是ODBC驱动与PHP扩展兼容性问题,或是脚本中存在驱动资源重复调用未释放的情况。
  • 确保使用的Sybase ASE ODBC驱动是适配Windows Server 2019和PHP 8.3的最新版本,避免版本不兼容导致的崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:14:55