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代码行
配置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进程,确保崩溃时生成完整转储文件。
- 编辑
安装Windows调试工具
- 从Windows SDK安装「Windows调试工具」,启动
WinDbg Preview。
- 从Windows SDK安装「Windows调试工具」,启动
分析崩溃转储
- 打开WinDbg,加载崩溃转储文件(默认路径:
C:\ProgramData\Microsoft\Windows\WER\ReportArchive)。 - 执行命令
.symfix自动加载微软符号服务器的符号文件,再执行!analyze -v生成详细崩溃报告。 - 若报告中出现
sybdrvodb64.dll或php_odbc.dll的调用栈,执行k命令查看完整调用链,再用!phpstack命令(需PHP官方提供的调试符号)解析出对应的PHP文件路径和行号。
- 打开WinDbg,加载崩溃转储文件(默认路径:
方法2:通过日志追踪可疑请求
开启PHP慢日志
- 编辑
php.ini,添加慢日志配置:slowlog = "C:\php\logs\php_slow.log" request_slowlog_timeout = 1 ; 可根据实际调整超时阈值,单位秒 - 重启IIS后,慢日志会记录执行超时的请求,结合崩溃时间点排查可疑脚本。
- 编辑
启用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
相关产品推荐
相关产品推荐

