ウェブサーバ - apache がこける - その2

 クラウディア
1. 概要
2. core を出力する
3. gdb で core を見てみる

1. 概要

 以前に書いた内容と同じ現象かどうかは不明。  ただし、今回は再現性ありです。  特定のページである操作をしたときに発生するので、なんとか捕まえたいと思います。  ウェブサーバのエラーログには

[Tue Jun 26 12:47:39.237280 2018] [core:notice] [pid 4548] AH00052: child pid 6831 exit signal Segmentation fault (11)
 てな感じで出ておりますです。  まずは「[PHP] PHP5.4 + Apache 2.4 で Segmentation fault(リンク切れになりました)」を参考に、「core」をとるところから。

2. core を出力する

 メモっといてよかったです。  「メンテナンス・トラブルシュート - コマンド・ユーティリティ」を参考に「ulimit」の値を確かめて「core」のサイズが「unlimited」になっていることを確認。
/usr/local/etc/apache24/httpd.conf
 に以下の1行を追加

CoreDumpDirectory /tmp
 これで、「apache」がこけるときに「core dump」が吐かれると思って、落ちる操作をやってみるが、「core dump」が出力されない。  ずいぶん悩みましたが「Apache の異常終了」を読んでやっとわかりました。  「sysctl」の「kern.sugid_coredump」の設定値らしい。

$ sysctl kern.sugid_coredump
kern.sugid_coredump: 0
$ sysctl kern.sugid_coredump=1
kern.sugid_coredump: 0 -> 1
 これで「apache」を再起動してやっと落ちたときに
/tmp/httpd.core
 が出力されるようになりました。

3. gdb で core を見てみる

 やっと「core」が出力されたので「gdb」で見てみます。

> gdb /usr/local/sbin/httpd -c /tmp/httpd.core
 で gdb 上で

GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...(no debugging symbols found)...
Core was generated by `/usr/local/sbin/httpd -DNOHTTPACCEPT'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/local/lib/libpcre.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/libpcre.so.1

・・・略・・・

Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000808ca1275 in zend_get_zval_ptr_ptr () from /usr/local/libexec/apache24/libphp5.so
(gdb) where
#0  0x0000000808ca1275 in zend_get_zval_ptr_ptr () from /usr/local/libexec/apache24/libphp5.so
#1  0x0000000808c65241 in zend_execute () from /usr/local/libexec/apache24/libphp5.so
#2  0x0000000808c54f08 in execute_ex () from /usr/local/libexec/apache24/libphp5.so
#3  0x0000000808c29e9e in zend_execute_scripts () from /usr/local/libexec/apache24/libphp5.so
#4  0x0000000808bc540f in php_execute_script () from /usr/local/libexec/apache24/libphp5.so
#5  0x0000000808cb239a in zend_get_zval_ptr_ptr () from /usr/local/libexec/apache24/libphp5.so
#6  0x0000000000459787 in ap_invoke_handler ()
#7  0x0000000000470143 in ap_process_async_request ()
#8  0x00000000004701e4 in ap_process_request ()
#9  0x000000000046cd12 in ap_process_http_connection ()
#10 0x0000000000464636 in ap_process_connection ()
#11 0x00000008054abb85 in ?? () from /usr/local/libexec/apache24/mod_mpm_prefork.so
#12 0x00000008054ab6a2 in ?? () from /usr/local/libexec/apache24/mod_mpm_prefork.so
#13 0x00000008054aa96b in ?? () from /usr/local/libexec/apache24/mod_mpm_prefork.so
#14 0x000000000043be5b in ap_run_mpm ()
#15 0x00000000004345cc in main ()
 とまぁ、どこいらかで落ちているかは分かったものの、ソースがない。  「apache」と「PHP」をデバッグを有効にして、「make」しなおして(「PHP」は、関連モジュールまですべて「make」しなおさなければ、「Warning」が出るので大変)。  ソースを見られるようになったものの・・・ハックするのはなかなか大変で・・・。  結局、いまんとこ迷宮入り・・・。