2018年12月8日土曜日

ubuntu で coredump が出ない

事の発端は、CentOS + PHP7.2 の環境で開発してたものをデモ用に流用して運用してたところから始まります。最初は、何の問題もなくちゃんと動作してたんですわ。yum update をしていて、途中から ERR_CONTENT_LENGTH_MISMATCH や ERR_INVALID_URL というの頻出するようになりまして、apache がアクセス不能になるという現象に悩まされはじめました。自分の作ってた php extension が悪いのかな?とか思って、色々と試してみたんですが、extension の module をロードしない状態でも、ERR_CONTENT_LENGTH_MISMATCH が起こるので、これはもう CentOS 固有の問題ではないかと考えはじめて、Ubuntu の環境で同じものを作ってみる決断を下しました。
まあ、自作の extension は CentOS + PHP7.2 で動作していたんですが、PHPもソースから入れようと、コンパイルしてみたら 自作 extension のコンパイルが通らなかったり…。もう一度、ソースを見直してみると、php5.x 系 php7.0 系 php7.1系 php7.2系 で構造もマクロも変わって互換性がほとんどない。この件に関しては後日、まとめようと考えております。

本題に入りまして、Ubuntu環境で動作させてみると、 ERR_CONTENT_LENGTH_MISMATCH が起きません。
が、Ubuntu 環境では、自作 php extension が SIGSEGV で落ちます。PHP_MINIT_FUNCTION のコードはログに記録されているのですが、何故か他の箇所のログが一切記録されないので、コアダンプを調べたいと思いました。
$ ulimit -c unlimted
を apache2 環境でするための機構があるらしいという事で、 /etc/default/apache2 というファイルに ulimit -c unlimited の1行を加えてみました。
 ulimit -c unlimited
コアダンプが出ない(#^ω^)ピキピキ

こんなの見つけた。
systemd時代に困らないためのlimits設定
(゚д゚)(。_。)(゚д゚)(。_。) ウンウン、そうだよねー怒り感じるよねー。
...
......
コアダンプが出ない...
  ( ⌒ )
   l | /
  ∧_∧
⊂(#・д・)
 /   ノ∪
 しー-J |l|
         人ペシッ!!
       __
       \  \
          ̄ ̄

見つけました。
Ubuntuでコアダンプが出力できないことがある
ふむふむ… /etc/default/apport を見てみると
# set this to 0 to disable apport, or to 1 to enable it
# you can temporarily override this with
# sudo service apport start force_start=1
enabled=1
なんで、enabled=0 に変更する。

やっと出ました。コアダンプ…。

あと、ログが出ない現象は、extension の MINIT 時には /var/log/php/error.log に出力されてるんですが、途中から /var/log/apache2/error.log に出力先が移動してました。
こんなん、わかるかーーーーー!
  ( ⌒ )
   l | /
  ∧_∧
⊂(#・д・)
 /   ノ∪
 しー-J |l|
         人ペシッ!!
       __
       \  \
          ̄ ̄

apache2 のコアダンプの設定は、[Linux] coreファイルについてに習い
/etc/systemd/system/apache2.service.d/override.conf
というファイルを作成して
[Service]
LimitCORE=infinity
と記述する事で落ち着きました