GDB Einleitung:
GDB ist ein leistungsstarkes UNIX-Programm-Debugging-Tool, das von der GNU Open Source Organization veröffentlicht wurde. Wenn Sie auf der UNIX-Plattform arbeiten, werden Sie feststellen, dass GDB ein Debugging-Tool ist, das leistungsfähigere Funktionen hat als die grafischen Debugger von VC und BCB.
ausstellen
Umgebung: Linux/PHP v5.5.7
Wenn das Handy auf den Hintergrund dieser Seite zuruft, klicken Sie auf einige Seiten, und der 502-Fehler erscheint, und Sie möchten herausfinden, was der genaue Grund für den 502-Fehler ist.
PHP-FPM-Fehlerprotokoll sieht wie folgt aus:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
Kerndatei
Die Kerndatei ist tatsächlich ein Speicherabbild, das die entsprechenden Informationen des Speichers speichert, wenn das Programm abstürzt, und hauptsächlich zum Debuggen des Programms verwendet wird. Wenn das Programm abstürzt, wird eine Kerndatei generiert, tatsächlich sollte man sagen, dass es sich um eine Core-Dump-Datei handelt, der Standard-Erzeugungsort befindet sich im selben Verzeichnis wie das ausführbare Programm, der Dateiname ist core.***, wobei *** eine bestimmte Zahl ist.
Befehl:
Kerndateigröße (Blöcke, -c) 0 Daten-Seg-Größe (kbytes, -d) unbegrenzt Planungspriorität (-e) 0 Dateigröße (Blöcke, -f) unbegrenzt Ausstehende Signale (-i) 7271 Maximal gesperrter Speicher (kBytes, -l) 64 maximale Speichergröße (kbytes, -m) unbegrenzt Dateien öffnen (-n) 65535 Rohrgröße (512 Bytes, -p) 8 POSIX-Nachrichtenwarteschlangen (Bytes, -q) 819200 Echtzeit-Priorität (-r) 0 Stapelgröße (kbytes, -s) 8192 CPU-Zeit (Sekunden, -t) unbegrenzt MAX Benutzerprozesse (-u) 7271 Virtueller Speicher (kBytes, -V) unbegrenzt Dateisperren (-x) unbegrenzt Wenn die Kerndateigröße 0 ist, kann die Kerndatei nicht generiert werden, und wir müssen sie festlegen.
ulimit -c unlimited, das bedeutet, dass die Größe der Kerndatei unbegrenzt ist
Aufbau abgeschlossen, denk daranStarte den php-fpm-Dienst neu, lautet der Befehl wie folgt:
Überprüfen Sie das Fehlerprotokoll noch einmal wie folgt:
[23. Mai 2020 14:39:14] WARNUNG: [Pool www] Kind 2220 verließ das Signal 11 (SIGSEGV – Kern entlastet) nach 7,255225 Sekunden nach Beginn [23. Mai 2020 14:39:14] HINWEIS: [Pool www] Kind 2231 gestartet Wenn das Log die Worte "SIGSEGV – core dumped" enthält, bedeutet das, dass die Rore-Datei erfolgreich generiert wurde.
Die Kerndatei wird unter dem Website-Verzeichnis generiert; falls Sie es nicht wissen, können Sie die Kerndatei auch mit folgendem Befehl finden:
Die vom Kern meines Servers generierte Adresse lautet: /alidata/www/itsvse_web/core.2220
Installiere gdb
Der Befehl lautet wie folgt:
GDB-Debugging PHP-FPM
Bereite die .gdbinit-Datei vor
Die .gdbinit-Datei befindet sich unter dem PHP-Quellcode und muss mit der PHP-Version übereinstimmen, die du ausführst!
Meine Dateiadresse: /root/sh-1.5.5/php-5.5.7/.gdbinit
Download-Adresse der neuesten php-Version der .gdbinit-Datei:
Der Hyperlink-Login ist sichtbar.
gdb, um die Kerndatei zu öffnen
Im Kern-Dateiverzeichnis führen Sie folgenden Befehl aus:
[root@o itsvse_web]# gdb php-fpm -c core.2220 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Urheberrecht (C) 2013 Free Software Foundation, Inc. Lizenz GPLv3+: GNU GPL Version 3 oder neuer <Der Hyperlink-Login ist sichtbar. Das ist freie Software: Sie können sie ändern und weiterverbreiten. Es gibt KEINE GARANTIE, soweit es gesetzlich erlaubt ist. Geben Sie "Kopieren anzeigen" ein. und "Garantie anzeigen" für Details. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Für Anweisungen zur Fehlermeldung siehe bitte: <Der Hyperlink-Login ist sichtbar. Lese Symbole aus /alidata/server/php-5.5.7/sbin/php-fpm... fertig. [Neues LWP 2220] [Thread-Debugging mit aktivierter libthread_db] Verwendung von Host-libthread_db-Bibliothek "/lib64/libthread_db.so.1". Core wurde von 'php-fpm: pool www' generiert. Das Programm wurde mit Signal 11 beendet, Segmentierungsfehler. #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) bei /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 751 { Fehlende separate Debuginfos, benutze: 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 Man kann so etwas wie die folgenden Wörter sehen:
Core wurde von 'php-fpm: pool www' generiert. Das Programm wurde mit Signal 11 beendet, Segmentierungsfehler. bt(backtrace): Listet den Aufrufstapel auf
(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) bei /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 #1 0x000000000075209a in virtual_file_ex (Zustand=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) bei /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292 #2 0x000000000075308c in 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") bei /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Überprüfe den Exit-Thread
Einführung von .gdbinit (gdb-Befehlsskripting), das im PHP-Quellcode bereitgestellt wird
Schau dir die Zbacktrace- und Variablenwerte an
(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] template("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] template("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) Drucken ((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) Lösung
Ich habe tatsächlich keine Fehler gesehen, aber aus den Protokollen war offensichtlich, dass es ein Problem mit dem mobilen Zugriff gab, und nach Tests stellte sich heraus, dass es tatsächlich nur ein 502-Fehler im Fall des mobilen Zugangs war.
Da es im Hintergrund keine mobile Version gibt, habe ich direkt den admin.php-Quellcode geändert und folgenden Code in der ersten Zeile hinzugefügt:
Auf diese Weise erhält das Programm immer eine Zugriffsanfrage vom PC-Browser und geht nicht durch den logischen Code der Handyversion, gelöst!
|