Foren: Offene Diskussion (Thread #25377)

Segmentation fault について (2010-02-09 22:05 by myamada_bsd #48440)

はじめまして。
SWFEDの存在をしり、いろいろ試していたところ、ちょっと困った現象が発生しています。

利用しているのは7.2-RELEASE-p6でPHP 5.2.12です。

echo $obj->output();
とFlashの出力をするときに、何度も出力をやるとたまにapacheが シグナル11をはいています。
[notice] child pid 41389 exit signal Segmentation fault (11)

一応、gdb で詳細を見つけようとしましたが、エラーの出ている箇所が /lib/libc.so.7 でした。
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x8013020b0 (LWP 100090)]
0x00000008010f9bc9 in free () from /lib/libc.so.7

毎回発生するのではなく、10回ぐらいF5連打するとだいたい発生する程度の頻度です。
とても良いアプリケーションですので、開発のお役に立てればと思い投稿させていただきました。
もちろん、解決すればさらに幸せですが・・・

RE: Segmentation fault について (2010-02-09 23:59 by yoya #48445)

ご報告有難うございます。

普段、Linux (CentOS)でエージング試験を行っていますが、
FreeBSD での確認は手薄でした。環境を作って再現を試みます。
Reply to #48440

RE: Segmentation fault について (2010-02-10 14:53 by myamada_bsd #48456)

返事ありがとうございます。
出ている箇所が/lib/libc.so.7と、どちらかというとOS依存ぽいところで出ているので、休日にてもデバッグオプションで/lib/libc.so.7を作り直して、もう少し詳細な情報が出ないか試してみます。

ちなみに、output() をたたかなければ、Segmentation fault は200回程度たたいても発生しませんでした。
Reply to #48440

RE: Segmentation fault について (2010-02-10 20:15 by myamada_bsd #48478)

stack を取ってみました。

#0 free (ptr=0x807e0ee00) at /usr/src/lib/libc/stdlib/malloc.c:3218
#1 0x000000080550d2e1 in swf_tag_destroy (tag=0x8088e5940)
at /usr/local/src/trunk/src/swf_tag.c:113
#2 0x000000080550bf86 in swf_object_close (swf=0x8085d2380)
at /usr/local/src/trunk/src/swf_object.c:35
#3 0x000000080550bf1b in free_swfed_resource (resource=0x808ba8648)
at /usr/local/src/trunk/src/swfed.c:861
#4 0x0000000804e05e97 in list_entry_destructor (ptr=0x808ba8648)
at /usr/ports/lang/php5/work/php-5.2.12/Zend/zend_list.c:184
#5 0x0000000804e034fd in zend_hash_apply_deleter (ht=0x805064f48, p=0x808c19898)
at /usr/ports/lang/php5/work/php-5.2.12/Zend/zend_hash.c:805
#6 0x0000000804e0367c in zend_hash_graceful_reverse_destroy (ht=0x805064f48)
at /usr/ports/lang/php5/work/php-5.2.12/Zend/zend_hash.c:840
#7 0x0000000804e06045 in zend_destroy_rsrc_list (ht=0x805064f48)
at /usr/ports/lang/php5/work/php-5.2.12/Zend/zend_list.c:240
#8 0x0000000804df3f14 in zend_deactivate ()
at /usr/ports/lang/php5/work/php-5.2.12/Zend/zend.c:947
#9 0x0000000804d9041b in php_request_shutdown (dummy=0x0)
at /usr/ports/lang/php5/work/php-5.2.12/main/main.c:1510
#10 0x0000000804e83666 in php_apache_request_dtor (r=0x807e71bc8)
at /usr/ports/lang/php5/work/php-5.2.12/sapi/apache2handler/sapi_apache2.c:481
#11 0x0000000804e83e3d in php_handler (r=0x807e71bc8)
at /usr/ports/lang/php5/work/php-5.2.12/sapi/apache2handler/sapi_apache2.c:653
#12 0x000000000043d17a in ap_run_handler (r=0x807e71bc8) at config.c:157
#13 0x000000000043da7b in ap_invoke_handler (r=0x807e71bc8) at config.c:372
#14 0x000000000044f71a in ap_internal_redirect (
new_uri=0x807e71ba0 "/index.php/swf/mente1/?farm=1000", r=0x807e6d0a8)
at http_request.c:501
#15 0x0000000804b1af1a in handler_redirect (r=0x807e6d0a8) at mod_rewrite.c:4819
#16 0x000000000043d17a in ap_run_handler (r=0x807e6d0a8) at config.c:157
#17 0x000000000043da7b in ap_invoke_handler (r=0x807e6d0a8) at config.c:372
#18 0x000000000044ed54 in ap_process_request (r=0x807e6d0a8) at http_request.c:282
#19 0x000000000044bbb4 in ap_process_http_connection (c=0x807e67298)
at http_core.c:190
#20 0x00000000004469da in ap_run_process_connection (c=0x807e67298)
at connection.c:43
#21 0x0000000000446e2b in ap_process_connection (c=0x807e67298, csd=0x807e670a8)
at connection.c:178
#22 0x00000000004558b5 in child_main (child_num_arg=0) at prefork.c:662
---Type <return> to continue, or q <return> to quit---
#23 0x0000000000455999 in make_child (s=0x801317720, slot=0) at prefork.c:702
#24 0x0000000000455f47 in ap_mpm_run (_pconf=0x801312028, plog=0x801344028,
s=0x801317720) at prefork.c:978
#25 0x00000000004238ff in main (argc=4, argv=0x7fffffffebf0) at main.c:740
Reply to #48440

RE: Segmentation fault について (2010-02-10 20:49 by yoya #48479)

調査して頂き、有難うございます。

void swf_tag_destroy(swf_tag_t *tag) {
if (! tag) {
return;
}
if (tag->data) {
free(tag->data); // ←該当箇所
}

free だけして NULLを入れてない場所がありそうですね…
早速、この観点でコードをチェックしてみます。
Reply to #48478

RE: Segmentation fault について (2010-02-11 22:37 by myamada_bsd #48508)

こちらでもちょっといじってみました。
free 後に NULLを入れていない物で、怪しいのは片っ端から入れてみましたが、相変わらず出ますね。なんででしょ?
Reply to #48440

RE: Segmentation fault について (2010-02-12 01:29 by yoya #48512)

実験、ありがとうございます。

こちらでは、FreeBSD7.2 + apache2.2.11 + php5.2.9 の環境を
構築して、replaceJpeg & output のサンプルで試しました。

Web 越しに wget でしつこく叩いても再現しないのですが、
output を loop させて 18回以上呼ぶと seg.fault が発生
しました。

cli モードでも発生するので、タイミング問題でもなさそうです。
PHP binding を含めて output 周辺を一通り見直そうと思います。
Reply to #48508

RE: Segmentation fault について (2010-02-12 10:27 by myamada_bsd #48521)

こちらでもgdb起動で行うと、きっちり3回目に発生します。
どうも、出力するサイズによって、出てくる回数が決まってきてるのかな?という感じでしょうか?勝った端からNULLを入れた後は2回で発生するようになりました。
Flashのサイズは80Kb程度です。
現在の状況をみると、freeされた物を再度freeしちゃっているのかな?と思っていたのですが認識あってますか?
PHP binding周りを理解していないので、この辺は私には謎です・・・
Reply to #48512

RE: Segmentation fault について (2010-02-12 11:58 by myamada_bsd #48523)

素人予想で申し訳ないのですが、emalloc したものが efree で解放されていないようなのですが、これって問題ないのでしょうか?
Reply to #48512

RE: Segmentation fault について (2010-02-12 12:49 by yoya #48524)

swfed.c 内で emalloc しているものは、PHP 側に渡したいデータ
(メソッドの戻り値)でして、PHP 側でないと free するタイミング
を判断できない(or 全てが終わってからでないと free 出来ない)為に、
RETURN_STRINGL の第三引数(dup) 0 指定で PHP 側に GC までお任せする。
という意図でコーディングしました。

ただ、スマートではないと感じているので、もっと良い方法を探し中です。







Reply to #48523

RE: Segmentation fault について (2011-02-24 01:11 by yoya #55962)

今更ですみません。
JPEG chunk 入れ替え処理で free し過ぎていたのを直しました。
0.28 からは大丈夫だと思います。
Reply to #48440