it-swarm.cn

跟踪PHP中的分段错误?

我正在寻找一种相对无痛的方法来跟踪PHP中的分段错误(如Apache错误日志中所述)。这是我目前的LAMP设置:

Linux:OpenSUSE 11.3 x86_64
Apache:2.2.15-3.7
MySQL:5.1.46-2.18
PHP:5.3.2-1.31

有问题的代码不是我自己的,它是Gallery2: http://gallery.menalto.com 典型的情况是我去了画廊主页,没有缩略图出现,但我得到错误日志中的一组新的分段错误错误。

鉴于该软件的相对复杂性,它并不特别适合简单的调试形式。我希望能够逐步完成代码,看看究竟发生了什么。到目前为止,我所看到的“解决方案”与“相对无痛”相差甚远。

我已成功在此服务器(早期版本的LAMP软件包)和其他服务器上使用Gallery2,因此我假设当前配置存在缺陷,但无法查看故障发生的位置,我不能修复或解决它。

3
S. W.

我可以建议看看 http://sourceforge.net/tracker/index.php?func=detail&aid=1692166&group_id=7130&atid=1071http://gallery.menalto.com/节点/ 62436#评论-22857

使用Apache_setenv或两次gzipping URL似乎存在常见问题(取决于场景 - 前者似乎更有可能在缩略图不显示的情况下):

我认为问题是mod_deflate尝试根据URL第二次gzip数据,这会导致某些系统出现故障。告诉它不要gzip我们发送的文件在这种情况下有所帮助。


PHP中可能存在错误。尝试将$gallery->setConfig('apacheSetenvBroken', 1);添加到config.php以禁用Apache_setenv()函数

感谢这不是你要问的问题的答案(除了使用 Zend Framework 使用插件或命令行php和gdb我不知道如何在PHP中调试segfaults)但它可能有所帮助。

2
Metalshark

要调试PHP segfaults,你通常会创建一个新的.php文件(这样它不会干扰你的主代码),就像这样(调用它my_first_debugger.php):

<?php
include('annoying_caller_page_that_crashes.php');
?>

然后运行gdb php如果没有安装gdb或gdb/php二进制文件不在你的路径中会有错误,所以使用YaST2安装所需的一切(获取php的开发/调试库,因为它们通常包含调试符号)。

你会得到如下输出:

GNU gdb x.x
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
(gdb) 

然后在命令行中执行run my_first_debugger.php

如果有(no debugging symbols found)之类的消息,请查找-dev和-dbg包,否则您可能看不到被调用函数的名称。

0
Metalshark