2012-10-26 6 views
25

私はセグメンテーションフォールトを引き起こすコマンドラインPHPジョブを実行しています。この仕事は長い間働いていましたが、電子メールで処理されるものが処理されています。このメールには何かがありますが、何が分かりません。私は「BT」を行う場合、私はちょうど何度も何度も、この「一致」ステートメントを取得このPHPセグメンテーションフォルトを診断するにはどうすればよいですか?

​​

:私はGDBにコアファイルを置く場合、それは本当に何の助けません。最初の数は次のとおりです。

#1 0x000000000046ef1e in match (
    eptr=0x1370a887 "/td>\n\t\t\t\t\t\t\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t</table>\n\t\t\t</td>\n\t\t</tr>\n\t\t\n\t\t<tr>\n\t\t\t<td style=\"border-top:3px solid #efefef; padding:20px 10px;\">\n\t\t\t\t<table style=\"width:100%;\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\n", '\t' <repeats 12 times>, "\n\t\t\t\t"..., ecode=0x133dc3a5 "_", mstart=<value optimized out>, markptr=<value optimized out>, 
    offset_top=<value optimized out>, md=0x7fffb4b1b620, ims=0, eptrb=0x0, flags=0, rdepth=17679) at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:803 
#2 0x0000000000479789 in match (
    eptr=0x1370a887 "/td>\n\t\t\t\t\t\t\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t</table>\n\t\t\t</td>\n\t\t</tr>\n\t\t\n\t\t<tr>\n\t\t\t<td style=\"border-top:3px solid #efefef; padding:20px 10px;\">\n\t\t\t\t<table style=\"width:100%;\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\n", '\t' <repeats 12 times>, "\n\t\t\t\t"..., ecode=0x133dc5ca "V\002%\033U\002.", mstart=<value optimized out>, 
    markptr=<value optimized out>, offset_top=<value optimized out>, md=0x7fffb4b1b620, ims=0, eptrb=0x0, flags=0, rdepth=<value optimized out>) 
    at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:1623 
#3 0x000000000046ef1e in match (
    eptr=0x1370a886 "</td>\n\t\t\t\t\t\t\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t</table>\n\t\t\t</td>\n\t\t</tr>\n\t\t\n\t\t<tr>\n\t\t\t<td style=\"border-top:3px solid #efefef; padding:20px 10px;\">\n\t\t\t\t<table style=\"width:100%;\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\n", '\t' <repeats 12 times>, "\n\t\t\t"..., ecode=0x133dc3a5 "_", mstart=<value optimized out>, markptr=<value optimized out>, 
    offset_top=<value optimized out>, md=0x7fffb4b1b620, ims=0, eptrb=0x0, flags=0, rdepth=17677) at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:803 
#4 0x0000000000479789 in match (
    eptr=0x1370a886 "</td>\n\t\t\t\t\t\t\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t</table>\n\t\t\t</td>\n\t\t</tr>\n\t\t\n\t\t<tr>\n\t\t\t<td style=\"border-top:3px solid #efefef; padding:20px 10px;\">\n\t\t\t\t<table style=\"width:100%;\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\n", '\t' <repeats 12 times>, "\n\t\t\t"..., ecode=0x133dc5ca "V\002%\033U\002.", mstart=<value optimized out>, 
    markptr=<value optimized out>, offset_top=<value optimized out>, md=0x7fffb4b1b620, ims=0, eptrb=0x0, flags=0, rdepth=<value optimized out>) 
    at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:1623 
#5 0x000000000046ef1e in match (
    eptr=0x1370a885 "\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t</tr>\n\t\t\t\t\t\n\t\t\t\t</table>\n\t\t\t</td>\n\t\t</tr>\n\t\t\n\t\t<tr>\n\t\t\t<td style=\"border-top:3px solid #efefef; padding:20px 10px;\">\n\t\t\t\t<table style=\"width:100%;\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t\n", '\t' <repeats 12 times>, "\n\t\t"..., ecode=0x133dc3a5 "_", mstart=<value optimized out>, markptr=<value optimized out>, 
    offset_top=<value optimized out>, md=0x7fffb4b1b620, ims=0, eptrb=0x0, flags=0, rdepth=17675) at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:803 

私は本当にここにいます。 straceでコマンドを実行しようとしましたが、PEAR Mail_Queueライブラリでseg-faultingと思われます。ここでのstraceの終わりには、(いくつかの識別情報が削除されました)です:

lstat("/src/prod/releases/20121025202143/www/application/pear/MDB2/Driver/mysql.php", {st_mode=S_IFREG|0770, st_size=55723, ...}) = 0 
lstat("/src/prod/releases/20121025202143/www/application/pear/MDB2/Driver", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0 
lstat("/src/prod/releases/20121025202143/www/application/pear/MDB2", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0 
lstat("/src/prod/releases/20121025202143/www/application/pear", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0 
open("/src/prod/releases/20121025202143/www/application/pear/MDB2/Driver/mysql.php", O_RDONLY) = 6 
fstat(6, {st_mode=S_IFREG|0770, st_size=55723, ...}) = 0 
fstat(6, {st_mode=S_IFREG|0770, st_size=55723, ...}) = 0 
fstat(6, {st_mode=S_IFREG|0770, st_size=55723, ...}) = 0 
mmap(NULL, 55723, PROT_READ, MAP_SHARED, 6, 0) = 0x2b49f7bb4000 
brk(0x987b000)       = 0x987b000 
brk(0x98bb000)       = 0x98bb000 
munmap(0x2b49f7bb4000, 55723)   = 0 
close(6)        = 0 
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 6 
fcntl(6, F_SETFL, O_RDONLY)    = 0 
fcntl(6, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(6, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 
connect(6, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("IP ADDRESS TO DB SERVER REMOVED")}, 16) = -1 EINPROGRESS (Operation now in progress) 
fcntl(6, F_SETFL, O_RDWR)    = 0 
poll([{fd=6, events=POLLIN|POLLPRI}], 1, 60000) = 1 ([{fd=6, revents=POLLIN}]) 
setsockopt(6, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 
setsockopt(6, SOL_SOCKET, SO_SNDTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 
setsockopt(6, SOL_IP, IP_TOS, [8], 4) = 0 
setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
setsockopt(6, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0 
poll([{fd=6, events=POLLIN}], 1, 60000) = 1 ([{fd=6, revents=POLLIN}]) 
read(6, "C\0\0\0\n5.1.37-1ubuntu5.5-log\0Q\257\3\0009"..., 16384) = 71 
write(6, "=\0\0\1\205\242\2\0\0\0\[email protected]\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65) = 65 
read(6, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11 
poll([{fd=6, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) 
write(6, "\10\0\0\0\2xxxxx", 12)  = 12 
read(6, "\7\0\0\1\0\0\0\2\0\0\0", 16384) = 11 
lstat("/src/prod/current/www/application/pear/Mail/mime.php", {st_mode=S_IFREG|0770, st_size=50252, ...}) = 0 
lstat("/src/prod/current/www/application/pear/Mail", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0 
lstat("/src/prod/current/www/application/pear", {st_mode=S_IFDIR|0770, st_size=4096, ...}) = 0 
lstat("/src/prod/current/www/application", {st_mode=S_IFDIR|0776, st_size=4096, ...}) = 0 
--- SIGSEGV (Segmentation fault) @ 0 (0) --- 
+++ killed by SIGSEGV +++ 
Segmentation fault 

誰が捜査のラインに任意のアイデアやポインタを持っている場合、私はそれを本当に感謝します。私は本当にこの1つに困っています。

+4

おそらく実際に病理学的な入力が原因で起こった、 'preg_match'のstackoverflowのように見えます。あなたのスクリプトのどの行が問題を引き起こしているのかを調べ、次に関数への入力が何であるかを判断し、PHPバグレポートを送信することができます:) – nneonneo

+0

これを解決できましたか? 2010年12月にリリースされたPHP 5.3.4を実行しているようですが、最新のバージョンにアップデートしようとしましたか? –

答えて

32

segfaultに遭遇すると、通常はxdebugを使用します。私は、次の行を使用することを好む:mytracedir /の下にトレース出力で

php -d xdebug.auto_trace=ON -d xdebug.trace_output_dir=mytracedir/ myscript.php 

を、あなたは簡単にスクリプトを壊すおおよそのPHPのラインを、把握することができます。次に、行ごとに1つのステートメントで行を書き換え、エラーをデバッグするためにerror_log()を使用します。 __destruct()または__toString()を使用すると、少し難しくなります。

詳細については、http://xdebug.org/docs/execution_traceを参照してください。

(拡張子がロードされますが、インストールされていない場合は、php -dzend_extension=xdebug.so [...]を追加しよう)

+0

それもクラッシュします。それでもいいツールだと思います;) – hakre

+1

はい、しかし、PHPのプロセスがクラッシュするまでにどれくらいの距離があるかを知ることができます。クラッシュする可能性のある行が複数ある場合(PCRE-recursion)、正しい行を見つける良い機会があります。少なくとも、私はそうするだろう;-) – Trendfischer

+1

右、良い点。また、xdebugとリモートデバッグを使用してこれを行うこともできます。 GDBでセッションを開始できるはずです。 +1。 – hakre

10

デバッガが既に何が起こるかを説明します:

... rdepth=17680) at /home/farmer/srcs/php-5.3.4/ext/pcre/pcrelib/pcre_exec.c:470 

pcre.recursion_limit settingを参照してください:

PCRE .recursion_limit - PCREの再帰制限。この値を高い値に設定すると、使用可能なプロセススタックをすべて消費し、最終的にオペレーティングシステムによって課されるスタックサイズ制限に達するため、PHPがクラッシュする可能性があります。

クイックフィックスではもうクラッシュしないように値を減らしてください。正規表現でHTMLが完全に処理されていないことがわかります。

再帰にあまり依存しないように表現を改善しました。たぶん、HTMLパーサを使用したいだけです。

1

opcacheセクションのコメントを含むmemcache.soを削除し、コマンドラインphp.iniからopcacheを無効にしてください。 -c path/php.cli.iniと '-d memory_limit -1'パラメータを使ってスクリプトを実行する投稿

関連する問題