Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 7943|Odgovoriti: 0

Uporabite gdb za odpravljanje napake pri php-fpm izjemi

[Kopiraj povezavo]
Objavljeno na 23. 05. 2020 17:54:01 | | | |
Uvod v GDB:

GDB je zmogljivo orodje za odpravljanje napak UNIX programov, ki ga je izdala organizacija GNU Open Source. Če delate na UNIX platformi, boste ugotovili, da je GDB orodje za odpravljanje napak, ki ima zmogljivejše funkcije kot grafični razhroščevalniki VC in BCB.

vprašanje

Okolje: Linux/PHP v5.5.7

Ko mobilni telefon dostopa do ozadja te strani, kliknite na nekaj strani in se bo prikazala napaka 502, zato želite izvedeti, kaj je točen razlog za napako 502.

PHP-FPM dnevnik napak je naslednji:

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

Osnovna datoteka

Osnovna datoteka je pravzaprav slika pomnilnika, ki shrani ustrezne informacije pomnilnika ob sesutju programa in se večinoma uporablja za odpravljanje napak programa. Ko program crkne, se ustvari osnovna datoteka, pravzaprav naj bi bila to datoteka za izpust jedra, privzeta lokacija generiranja je v isti mapi kot izvršljivi program, ime datoteke je core.***, kjer je *** določena številka.

Ukaz:

Velikost osnovne datoteke (bloki, -c) 0
Velikost podatkovnega seg-a (kbajt, -d) neomejeno
Prioriteta razporejanja (-e) 0
Velikost datoteke (bloki, -f) Neomejeno
Čakajoči signali (-i) 7271
Maksimalno zaklenjen pomnilnik (Kbytes, -L) 64
Največja velikost pomnilnika (kbajt, -m) neomejeno
Open Files (-n) 65535
Velikost cevi (512 bajtov, -p) 8
POSIX vrste sporočil (bajti, -q) 819200
Prioriteta v realnem času (-R) 0
Velikost sklada (kbajti, -s) 8192
CPU čas (sekunde, -t) neomejen
Maksimalni uporabniški procesi (-U) 7271
Navidezni pomnilnik (kbajti, -v) Neomejeno
Neomejeno zaklepanje datotek (-x)

Če je velikost osnovne datoteke 0, jedrne datoteke ni mogoče generirati in jo moramo nastaviti.

ulimit -c unlimited, pomeni, da je velikost jedrne datoteke neomejena


Priprava končana, ne pozabitePonovno zaženi php-fpm storitev, ukaz je naslednji:



Ponovno preverite dnevnik napak, kot sledi:

[23. maj 2020 14:39:14] OPOZORILO: [bazen www] otrok 2220 je izstopil na signalu 11 (SIGSEGV - jedro izpraznjeno) po 7,255225 sekundah od začetka
[23. maj 2020 14:39:14] OBVESTILO: [bazen www] otrok 2231 se je začel

Če dnevnik vsebuje besede "SIGSEGV – core dumped", to pomeni, da je bila datoteka rore uspešno generirana.

Osnovna datoteka bo ustvarjena pod imenikom spletne strani, če ne veste, lahko tudi poiščete osnovno datoteko z naslednjim ukazom:


Naslov, ki ga ustvari jedro mojega strežnika, je: /alidata/www/itsvse_web/core.2220

Namesti gdb

Ukaz je naslednji:



gdb debug php-fpm

Pripravite datoteko .gdbinit

.gdbinit datoteka je pod izvorno kodo PHP in mora biti skladna z različico php, ki jo uporabljate!

Moj naslov datoteke: /root/sh-1.5.5/php-5.5.7/.gdbinit

Naslov za prenos najnovejše PHP različice datoteke .gdbinit:

Prijava do hiperpovezave je vidna.

gdb za odpiranje osnovne datoteke

V osnovni datotečni mapi zaženite naslednji ukaz:

[root@o itsvse_web]# gdb php-fpm -c core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Avtorske pravice (C) 2013 Free Software Foundation, Inc.
Licenca GPLv3+: GNU GPL različica 3 ali novejša <Prijava do hiperpovezave je vidna.
To je prosta programska oprema: svobodno jo lahko spreminjate in ponovno distribuirate.
GARANCIJE NI, kolikor dovoljuje zakon.  Vnesite "prikaži kopiranje"
in "prikaži garancijo" za podrobnosti.
Ta GDB je bil konfiguriran kot "x86_64-redhat-linux-gnu".
Za navodila za prijavo napak si oglejte:
<Prijava do hiperpovezave je vidna.
Branje simbolov iz /alidata/server/php-5.5.7/sbin/php-fpm... Končano.
[Nova LWP 2220]
[Razhroščevanje niti z uporabo libthread_db omogočeno]
Uporaba gostiteljske libthread_db knjižnice "/lib64/libthread_db.so.1".
Core je generiral 'php-fpm: pool www'.
Program se je končal s signalom 11, napaka segmentacije.
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začetek=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
751        {
Če manjkajo ločeni debuginfos, uporabite: 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

Lahko vidite nekaj takega kot naslednje besede:

Core je generiral 'php-fpm: pool www'.
Program se je končal s signalom 11, napaka segmentacije.

bt(backtrace): Navaja klicni sklad

(GDB) BT
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začetek=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
#1 0x000000000075209a v virtual_file_ex (država=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292
#2 0x000000000075308c v 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") na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



Preglejte izhodno temo


Predstavljamo .gdbinit (gdb command scripting), ki je na voljo v izvorni kodi PHP



Poglej vrednosti zbacktrace in spremenljivk

(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] predloga ("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("globalno", "globalno") /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] predloga ("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("globalno", "globalno") /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] predloga ("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) tisk ((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)
Rešitev

Pravzaprav nisem opazil nobenih napak, vendar je bilo iz dnevnikov očitno, da je težava z mobilnim dostopom, in po testiranju je bila napaka 502 res le pri mobilnem dostopu.

Ker v ozadju ni mobilne različice, sem neposredno spremenil izvorno kodo admin.php in na prvo vrstico dodal naslednjo kodo:

Na ta način bo program vedno prejel zahtevo za dostop iz brskalnika na računalniku in ne bo šel skozi logično kodo mobilne različice, rešeno!




Prejšnji:Nginx prilagodi stran z napako 404 in vrne rešitev s statusno kodo 200
Naslednji:Osnovna uporaba [ngClass] in [ngStyle] v Angularju
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com