web-dev-qa-db-ja.com

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=1071 および http://gallery.menalto.com/ node/62436#comment-22857

Apache_setenvを使用するか、URLを2回gzipで圧縮することで一般的な問題があるようです(シナリオに応じて-前者はサムネイルが表示されない可能性が高いようです):

問題は、mod_deflateがURLに基​​づいてデータを再度gzipしようとするため、一部のシステムで破損が発生することだと考えています。この場合、送信するファイルをgzipしないように指示すると役立ちます。


PHPにバグがある可能性があります。 $gallery->setConfig('apacheSetenvBroken', 1);をconfig.phpに追加して、Apache_setenv()関数の使用を無効にしてみてください

これは、あなたが尋ねている質問に対する答えではありません(プラグインまたはコマンドラインphpとgdbで Zend Framework を使用する以外に、PHPでセグメンテーションフォールトをデバッグする方法がわかりません).

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