Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 7943|Antwort: 0

Verwenden Sie gdb, um den php-fpm-Ausnahmefehler zu debuggen

[Link kopieren]
Veröffentlicht am 23.05.2020 17:54:01 | | | |
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!




Vorhergehend:Nginx passt die 404-Fehlerseite an und liefert eine 200-Statuscode-Lösung zurück
Nächster:Grundlegende Verwendung von [ngClass] und [ngStyle] im Angular
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com