gdbで死んでるphpプロセスから諸々の情報を得るメモ

手法は色々出回っているがちょうど某サービスでcronジョブの途中でお亡くなりになっているプロセスがいるので便利コマンドを試しておく。

環境

php -v
PHP 5.5.8 (cli) (built: Feb  4 2014 16:57:24)

$ gdb -v
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)

対象

2017年からご存命の6792さんを調べる

  6777  0.0  0.0 275812    52 ?        S     2017   0:00 php -q /home/xxxx/momochro.me/app/Console/cake.php -working /home/xxx/momochro.me/app update_and_notify -app /home/xxxx/momochro.me/app
  6791  0.0  0.0 273184   200 ?        S     2017   0:00  \_ /usr/local/bin/php /home/xxx/momochro.me/app/Console/do.php update_momo_items
  6792  0.0 17.4 280772 177860 ?       S     2017   0:00      \_ php -q /home/xxx/momochro.me/app/Console/cake.php -working /home/xxx/momochro.me/app update_momo_items -app /home/xxx/momochro.me/app

外から眺める

psで

$ ps -eopid,wchan:30,comm  |grep 6792
 6792 sk_wait_data                   php

sk_wait_dataで止まってる

sudo strace -p 6792
Process 6792 attached
read(10,

lsofで

$ sudo  lsof -i |grep 6792
php        6792      %USER%   10u  IPv4  937985628      0t0  TCP %HOSTNAME%:42784->202x6x245x194:https (ESTABLISHED)

202x6x245x194にestablishedになってる。 ということでhttpsなリクエストの最中に死んでそう。

gdb

phpソース直下の.gdbinitを読ませる

$ gdb -p 6792  --init-command=/usr/local/src/php-5.5.8/.gdbinit
(gdb) zbacktrace
[0x7ff32cff5860] file_get_contents("https://api.dmm.com/affiliate/v3/ItemList?api_id=xxxxxx&affiliate_id=xxx.....") /home/xxx/momochro.me/app/Lib/MomoParser/DMMItemParser.php:29
[0x7ff32cff5640] DMMItemParser->getList() /home/xxx/momochro.me/app/Console/Command/UpdateMomoItemsShell.php:41
[0x7ff32cff5498] UpdateMomoItemsShell->main() /home/xxx/momochro.me/lib/Cake/Console/Shell.php:393
...

file_get_contentsで雑にapi呼んでるところで止まってるのがわかる

$ dig +short api.dmm.com
202.6.245.194

上記をcoreを吐かせてgdb

$ gcore 6792
$ gdb /usr/local/bin/php core.6792  --init-command=/usr/local/src/php-5.5.8/.gdbinit

参考諸々

だいたいここを参照

PHPのcoredumpを読んでなぜSEGVで落ちたかを知りたい - Qiita

Robert Ames (.com!)