この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 7943|答える: 0

gdbを使ってphp-fpmの例外エラーをデバッグしてください

[リンクをコピー]
掲載地 2020/05/23 17:54:01 | | | |
GDBはじめに:

GDBはGNUオープンソース機構によってリリースされた強力なUNIXプログラムのデバッグツールです。 UNIXプラットフォームで作業している場合、GDBはVCやBCBのグラフィカルデバッガよりも強力な機能を持つデバッグツールであることがわかるでしょう。

発行

環境:Linux/PHP v5.5.7

携帯電話がこのサイトの背景にアクセスすると、いくつかのページをクリックすると502エラーが表示され、その具体的な理由を知りたいです。

PHP-FPMエラーログは以下の通りです:

WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start

コアファイル

コアファイルは実際にはメモリのイメージであり、プログラムがクラッシュした際の対応するメモリ情報を格納し、主にプログラムのデバッグに使用されます。 プログラムがクラッシュすると、コアファイルが生成されます。実際にはコアダンプファイルと言えるでしょう。デフォルトの生成場所は実行可能プログラムと同じディレクトリにあり、ファイル名はcore.***で、ここで***は一定の番号です。

命令:

コアファイルサイズ(ブロック数、-c) 0
データSEGサイズ(Kbytes, -D) 無制限
スケジューリング優先度(-e)0
ファイルサイズ(ブロック数、-f) 無制限
保留中の信号(-I)7271
最大ロックメモリ(kbytes, -l)64
最大メモリサイズ(kbytes, -m) 無制限
オープンファイル(-N) 65535
パイプサイズ(512バイト、-p)8
POSIXメッセージキュー(バイト、-q) 819200
リアルタイム優先度(-r)0
スタックサイズ(kbytes, -s) 8192
CPU時間(秒、-T) 無制限
最大ユーザープロセス(-U)7271
仮想メモリ(KBバイト、-V)無制限
ファイルロック(-x)無制限

コアファイルサイズが0なら、コアファイルを生成できず、設定する必要があります。

ulimit -c unlimitedは、コアファイルのサイズが無制限であることを意味します


セットアップ完了、覚えておいてくださいphp-fpmサービスを再起動してください、命令は以下の通りです:



エラーログを再度確認してください。

[2020年5月23日 14:39:14] 警告:[プールWWW] チャイルド2220は信号11で退出(SIGSEGV - コアダンプ)で開始から7.255225秒後に退出しました
[2020年5月23日 14:39:14] 通知:[プール www] 子ども2231が開始

ログに「SIGSEGV – core dumped」という言葉が含まれている場合、それはroreファイルが正常に生成されたことを意味します。

コアファイルはウェブサイトのディレクトリの下に生成されます。もしご存知でなければ、以下のコマンドでコアファイルを見つけることができます:


サーバーのコアで生成されたアドレスは /alidata/www/itsvse_web/core.2220 です。

gdbをインストールしてください

コマンドは以下の通りです:



GDB デバッグ PHP-FPM

.gdbinitファイルを準備してください

.gdbinitファイルはPHPのソースコードの下にあり、実行しているPHPバージョンと整合している必要があります!

私のファイルアドレス:/root/sh-1.5.5/php-5.5.7/.gdbinit

.gdbinitファイルの最新phpバージョンのダウンロードアドレス:

ハイパーリンクのログインが見えます。

コアファイルを開くためにGDBを起動します

コアファイルディレクトリで、以下のコマンドを実行します:

[root@o itsvse_web]# GDB PHP-FPM -C Core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
著作権 (C) 2013 フリーソフトウェア財団株式会社
ライセンス GPLv3+:GNU GPL バージョン3以降 <ハイパーリンクのログインが見えます。
これはフリーソフトウェアです。自由に変更したり再配布したりできます。
法律で許される範囲で保証はありません。  「show copying」と入力します
詳細は「保証を表示」といったものでした。
このGDBは「x86_64-redhat-linux-gnu」として設定されていました。
バグ報告の手順については、以下をご覧ください:
<ハイパーリンクのログインが見えます。
/alidata/server/php-5.5.7/sbin/php-fpm... からシンボルを読み取る 完成です。
[新LWP 2220]
[スレッドデバッグがlibthread_dbを有効にしています]
ホストのlibthread_dbライブラリ「/lib64/libthread_db.so.1」を使用しています。
コアは「php-fpm: pool www」によって生成されました。
プログラムは信号11、セグメンテーション障害で終了。
#0 tsrm_realpath_r(
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    start=start@entry=1, len=66, ll=ll@entry=0x7ffdd9ebf0f4, t=t@entry=0x7ffdd9ebf0f8,
    use_realpath=use_realpath@entry=2, is_dir=is_dir@entry=0, link_is_dir=link_is_dir@entry=0x0)
    /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
751        {
別々のdebuginfoが欠けている場合、debuginfo-install cyrus-sasl-lib-2.1.26-23.el7.x86_64 glibc-2.17-307.el7.1.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-46.el7.x86_64 libcom_err-1.42.9-17.el7.x86_64 libcurl-7.29.0-57.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libidn-1.28-4.el7.x86_64 libselinux-2.5-15.el7.x86_ 64 libssh2-1.8.0-3.el7.x86_64 libstdc++-4.8.5-39.el7.x86_64 libxml2-2.9.1-6.el7.4.x86_64 nspr-4.21.0-1.el7.x86_64 nss-3.44.0-7.el7_7.x86_64 nss-softokn-freebl-3.44.0-8.el7_ 7.x86_64 nss-util-3.44.0-4.el7_7.x86_64 openldap-2.4.44-21.el7_6.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 xz-libs-5.2.2-1.el7.x86_64 zlib-1.2.7-18.el7.x86_64

次のような言葉が見えます:

コアは「php-fpm: pool www」によって生成されました。
プログラムは信号11、セグメンテーション障害で終了。

bt(バックトレース):呼び出しスタックを一覧化します

(gdb) bt
#0 tsrm_realpath_r(
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    start=start@entry=1, len=66, ll=ll@entry=0x7ffdd9ebf0f4, t=t@entry=0x7ffdd9ebf0f8,
    use_realpath=use_realpath@entry=2, is_dir=is_dir@entry=0, link_is_dir=link_is_dir@entry=0x0)
    /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
#1 0x000000000075209a in virtual_file_ex (state=state@entry=0x7ffdd9ec0140、
    path=path@entry=0xed3a4d8 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    verify_path=verify_path@entry=0x0、use_realpath=use_realpath@entry=2)
    /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292
#2 0x000000000075308c tsrm_realpath (
    path=path@entry=0xed3a4d8 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    real_path=real_path@entry=0x7ffdd9ec1250 "vse_web/./source/plugin/dsu_amupper/pper.class.p\300\023\354\331\375\177") at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1954



退職スレッドを見直してください


PHPソースコードに含まれる.gdbinit(gdbコマンドスクリプト)の導入



zbacktraceや変数の値を確認してください

(GDB) Zbacktrace
[0xed9f8f0] lang() /alidata/www/itsvse_web/source/function/function_core.php:444
[0xed9e2e8] lang("core", "title_board_message")/alidata/www/itsvse_web/source/function/function_message.php:43
[0xed9a988] dshowmessage("mobile_template_no_found", "", array(1)[0xec46a28], array(0)[0xec46bc0], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426
[0xed9a6d8] showmessage("mobile_template_no_found", "", array(1)[0xec46a28]) /alidata/www/itsvse_web/source/function/function_core.php:618
[0xed97638] テンプレート("dsu_amupper:pper_foot")/alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(array(0)[0xec40028])
[0xed97080] call_user_func(array(2)[0xed6b8b0], array(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed954b8] hookscript("global", "global") /alidata/www/itsvse_web/source/function/function_core.php:1214
[0xed95218] hookscriptoutput("showmessage") /alidata/www/itsvse_web/data/template/8_8_touch_common_showmessage.tpl.php:1
[0xed949e8] ??? /alidata/www/itsvse_web/source/function/function_message.php:237
[0xed91088] dshowmessage("mobile_template_no_found", "", array(1)[0xec40c10], array(0)[0xec76d40], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426
[0xed90dd8] showmessage("mobile_template_no_found", "", array(1)[0xec40c10]) /alidata/www/itsvse_web/source/function/function_core.php:618
[0xed8dd38] template("dsu_amupper:pper_foot")/alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(array(0)[0xec39ab0])
[0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed8bbb8] hookscript("global", "global") /alidata/www/itsvse_web/source/function/function_core.php:1214
[0xed8b918] hookscriptoutput("showmessage") /alidata/www/itsvse_web/data/template/8_8_touch_common_showmessage.tpl.php:1
[0xed8b0e8] ??? /alidata/www/itsvse_web/source/function/function_message.php:237
[0xed651b0] dshowmessage("mobile_template_no_found", "", array(1)[0xecc0fe0], array(0)[0xec76718], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426
[0xed64f00] showmessage("mobile_template_no_found", "", array(1)[0xecc0fe0]) /alidata/www/itsvse_web/source/function/function_core.php:618
[0xed61e60] テンプレート("dsu_amupper:pper_foot")/alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(array(0)[0xeb834f8])

(gdb) 印刷 ((zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(GDB)PrintZV 1ドル
[0xec46a28] (refcount=5) array(1): {
    "URL\0" => [0xecb2fb0] (refcount=2) string(33): "/admin.php?action=index&mobile=no"
  }
(gdb)
解決

実際にはエラーは見られませんでしたが、ログからモバイルアクセスに問題があることは明らかで、テストの結果、モバイルアクセスの場合は502エラーでした。

モバイル版がバックグラウンドにないため、私はadmin.phpソースコードを直接修正し、最初の行に以下のコードを付け加えました。

こうすることで、プログラムは常にPCブラウザからアクセスリクエストを受け取り、モバイル版の論理コードを通さずに済みます。これで解決です!




先の:Nginxは404エラーページをカスタマイズし、200ステータスコードの解答を返します
次に:Angularにおける[ngClass]および[ngStyle]の基本的な使い方
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com