【问题标题】:how to obtain a stack trace when WAMP server crashes?WAMP 服务器崩溃时如何获取堆栈跟踪?
【发布时间】:2010-03-14 02:57:18
【问题描述】:

有时我的 WAMP 服务器会崩溃。我收到以下错误。

HTTP has encountered exception and needs to close.
Unreferenced Memory.
szAppName : httpd.exe     szAppVer : 2.2.11.0     szModName : php5ts.dll     
szModVer : 5.3.0.0     offset : 0000c309     


C:\DOCUME~1\blrcom\LOCALS~1\Temp\WERc677.dir00\httpd.exe.mdmp
C:\DOCUME~1\blrcom\LOCALS~1\Temp\WERc677.dir00\appcompat.txt

我的问题是如何获取堆栈跟踪来调试这个问题? 我应该使用 Windows 调试器吗windows debugger 还是我应该启用 WAMP 服务器配置中的某些设置?

【问题讨论】:

    标签: php crash stack-trace wamp


    【解决方案1】:

    您可以使用Debug Diag
    在启动调试诊断时弹出的“选择规则类型”对话框中选择“崩溃”规则。

    还可以查看 Tess Ferrandez 博客条目 Debugging Native memory leaks with Debug Diag 1.1。 (虽然这并不完全是您想要的,但阅读该博客永远错了;-))


    调试符号包含将可执行文件和代码“粘合”在一起的信息。 Microsoft 的调试符号格式称为“程序数据库”,它们通常存储在扩展名为 .pdb 的文件中。
    现在你只能得到“php5ts!zend_mm_shutdown+f69 的汇编指令”。应用程序调用了由 php5ts.dll 导出的函数zend_mm_shutdown,因此无论是否有调试符号,调试器都“知道”该函数。但它不知道导致编译器在 zend_mm_shutdown+f69 处构建机器指令的源代码。调试符号包含此类信息,因此调试器可以向您显示源代码和上下文。
    您可以为调试和发布版本创建调试符号(对于后者,它们通常不太准确)。但是我还没有找到用于 php 的 wamp 构建的调试包。
    对于 php.net/win32 构建,您可以从 http://windows.php.net/download/ 下载其发布构建的调试包。或者您可以下载源代码并自己创建调试版本。但是您不能将 wamp 可执行文件与 php.net 调试包混合使用(即,您不会为此使用 wamp 可执行文件/dll)。

    也许查看源代码可以提示您出了什么问题。但不知何故,我对此表示怀疑。 zend_mm_shutdown 中的 mm 可能代表“内存管理”。它可能只是释放了一些内存桶,并且它的一些数据结构在这一点上是错误的。那可能是其他一些代码覆盖了zend内存管理的数据。可能是处理错误的边缘情况(已释放但未从列表/数据结构中删除的东西)。坏事是潜在的问题可能在任何地方......远离最终导致访问冲突的代码。如果zend_mm_shutdown 真的是一些低级内存管理,那么可能没有太多关于改变数据结构的信息(以及为什么)。
    我宁愿先尝试另一个php构建,看看问题是否再次出现。用 php.net 构建替换 wamp 文件应该不难。这可能就像替换 wamp 安装中的 php 文件夹一样简单,然后查看是否也必须将一些文件复制到 apache 二进制文件夹中。
    但是先复制/备份完整的 wamp 文件夹....以防万一;-)

    【讨论】:

    • 我收到以下日志。我该怎么办?警告 - DebugDiag 无法找到 php5ts.dll 的调试符号,因此以下信息可能不完整。在 httpd__PID__16220__Date__03_20_2010__Time_01_20_53PM__269__Second_Chance_Exception_C0000005.dmp 在 C:\wamp\bin\apache\apache2.2.11\bin\php5ts.dll 的 C:\wamp\bin\apache\apache2.2.11\bin\php5ts.dll 的 php5ts!zend_mm_shutdown+f69 处的汇编指令导致访问冲突异常(0xC000 时试图从 0xC000 读取)线程 17 上的内存位置 0x0000000c
    • zend_mm_shutdown ...用于清理 php 实例(在服务请求之后)。您可以将 php 的 WAMP 构建替换为 php.net 构建,然后重试。
    • 非常感谢您的回复。如果您能回答这些问题,那就太好了 1) Debug Diag 无法找到符号?这是什么 ? 2)有什么办法可以知道是哪个脚本导致的吗?因为我有一些脚本正在运行。这个软件有没有可以给我更多细节的设置?
    • 非常感谢您的精心回复。我找到了 WAMP 版本的调试包。几天后,apache 服务器确实崩溃了。这是日志。在 httpd__PID__3428__Date__03_31_2010__Time_06_52_50PM__777__Second_Chance_Exception_C0000005.dmp 中的汇编指令 php5ts!_zend_mm_free_int+139 in C:\wamp\bin\apache\apache2.2.11\bin\php5ts.dll 来自 PHP Group 导致访问冲突异常(0xC000 时试图从 0xC000 读取)线程 61 上的内存位置 0x0000000c
    【解决方案2】:

    请从带有 php 5.3.0 调试包的工具调试诊断工具中查看以下日志。 用于访问 MySql 的 PDO 库是否有问题? 崩溃是非常间歇性的。请回复。

    线程 61 - 系统 ID 2760 入口点 msvcrt!_endthreadex+3a 创建时间 2010 年 3 月 31 日下午 5:25:46 在用户模式下花费的时间 0 天 0:0:16.593 在内核模式下花费的时间 0 天 0:0:0.453

    函数 Arg 1 Arg 2 Arg 3 源 php5ts!_zend_mm_free_int+139 0288a878 00020004 008eff46
    php5ts!_efree+36 0110ff48 02d18868 0090e442
    php5ts!_zval_ptr_dtor+66 024ffa88 02d18770 02d18848
    php5ts!zend_std_write_property+1f2 02d18848 0110ff48 02d18868
    php5ts!pdo_stmt_construct+7d 02d1b968 02d18848 0110eb90
    php5ts!zim_PDO_prepare+428 0110eb90 02d18848 00000000
    php5ts!zend_do_fcall_common_helper_SPEC+946 024ffbf8 028894c8 024ffe74
    php5ts!执行+29e 02d40070 02889400 00000000
    php5ts!zend_execute_scripts+f6 00000008 028894c8 00000000
    php5ts!php_execute_script+22d 024ffe74 028894c8 00000005
    php5apache2_2!php_handler+5d0 03249f98 008238b8 03249f98
    libhttpd!ap_run_handler+21 03249f98 03249f98 03249f98
    libhttpd!ap_invoke_handler+ae 00000000 029e9fd8 024fff38
    libhttpd!ap_die+29e 03249f98 00000000 00788168
    libhttpd!ap_get_request_note+1c9c 029e9fd8 029e9fd8 029e9fd8
    libhttpd!ap_run_process_connection+21 029e9fd8 00775050 024fff80
    libhttpd!ap_process_connection+33 029e9fd8 027de3f0 00ed0000
    libhttpd!ap_regkey_value_remove+c7c 029e9fd0 00ed0000 00f10000
    msvcrt!_endthreadex+a9 011d3088 00ed0000 00f10000
    kernel32!BaseThreadStart+37 77c3a341 011d3088 00000000

    【讨论】:

    • 它看起来像 pdo->prepare 崩溃(实际上是 efree,但 you 在 php 脚本中调用的最后一件事是 pdo->prepare)。我真的会尝试 php.net win32 构建。
    • 好的,我将尝试使用最新的 php 构建并更新您。非常感谢您的意见。
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多