Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 7943|Odpoveď: 0

Použite gdb na ladenie chyby výnimky php-fpm

[Kopírovať odkaz]
Zverejnené 23. 5. 2020 17:54:01 | | | |
Úvod do GDB:

GDB je výkonný nástroj na ladenie UNIX programov, ktorý vydala organizácia GNU Open Source. Ak pracujete na UNIX platforme, zistíte, že GDB je ladiaci nástroj, ktorý má výkonnejšie funkcie než grafické debuggery VC a BCB.

vydať

Prostredie: Linux/PHP v5.5.7

Keď sa mobilný telefón dostane na pozadie tejto stránky, kliknite na niektoré stránky a zobrazí sa chyba 502 a chcete zistiť, čo je konkrétnym dôvodom tejto chyby.

Chybový záznam php-fpm je nasledovný:

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

Jadrový súbor

Jadrový súbor je v skutočnosti obraz pamäte, ktorý ukladá zodpovedajúce informácie o pamäti pri páde programu a používa sa hlavne na ladenie programu. Keď program spadne, vygeneruje sa core súbor, v skutočnosti by sa mal povedať, že ide o core dump súbor, predvolené miesto generovania je v tom istom adresári ako spustiteľný program, názov súboru je core.***, kde *** je určité číslo.

Príkaz:

Veľkosť jadrového súboru (bloky, -c) 0
Veľkosť dátového segu (kbyte, -d) neobmedzená
Priorita plánovania (-e) 0
Veľkosť súboru (bloky, -f) neobmedzená
Čakajúce signály (-i) 7271
Maximálne uzamknutá pamäť (Kbytes, -L) 64
Maximálna veľkosť pamäte (kbyte, -m) neobmedzená
Open Files (-n) 65535
Veľkosť potrubia (512 bajtov, -p) 8
POSIX správy (bajty, -q) 819200
Priorita v reálnom čase (-r) 0
Veľkosť zásobníka (kbyte, -s) 8192
CPU čas (sekundy, -t) neobmedzený
Max User Processes (-u) 7271
Virtuálna pamäť (kbyte, -v) neobmedzená
Neobmedzené zámky súborov (-x)

Ak je veľkosť jadrového súboru 0, jadrový súbor sa nedá vygenerovať a musíme ho nastaviť.

ulimit -c unlimited, znamená, že veľkosť jadrového súboru je neobmedzená


Príprava dokončená, pamätajte.Reštartujte službu php-fpm, príkaz je nasledovný:



Skontrolujte chybový záznam znova, nasledovne:

[23. máj 2020 14:39:14] UPOZORNENIE: [pool www] dieťa 2220 vystúpilo na signáli 11 (SIGSEGV - jadro vypustené) po 7,255225 sekundách od štartu
[23. máj 2020 14:39:14] OZNÁMENIE: [pool www] dieťa 2231 začalo

Ak záznam obsahuje slová "SIGSEGV – core dumped", znamená to, že súbor rore bol úspešne vygenerovaný.

Jadrový súbor bude vygenerovaný v adresári webovej stránky, ak neviete, môžete nájsť aj jadrový súbor pomocou nasledujúceho príkazu:


Adresa generovaná jadrom môjho servera je: /alidata/www/itsvse_web/core.2220

Inštalovať gdb

Príkaz je nasledovný:



GDB Debug PHP-FPM

Pripravte súbor .gdbinit

Súbor .gdbinit je pod zdrojovým kódom PHP a musí byť konzistentný s verziou php, ktorú používate!

Adresa môjho súboru: /root/sh-1.5.5/php-5.5.7/.gdbinit

Stiahnite si adresu najnovšej verzie php súboru .gdbinit:

Prihlásenie na hypertextový odkaz je viditeľné.

gdb na otvorenie jadrového súboru

V adresári core súborov spustite nasledujúci príkaz:

[root@o itsvse_web]# gdb php-fpm -c core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Copyright (C) 2013 Free Software Foundation, Inc.
Licencia GPLv3+: GNU GPL verzia 3 alebo novšia <Prihlásenie na hypertextový odkaz je viditeľné.
Toto je slobodný softvér: môžete ho meniť a ďalej šíriť.
Neexistuje žiadna záruka, pokiaľ to zákon povoľuje.  Napíšte "zobraziť kopírovanie"
a "zobraziť záruku" pre detaily.
Tento GDB bol nakonfigurovaný ako "x86_64-redhat-linux-gnu".
Pre pokyny na hlásenie chýb si pozri:
<Prihlásenie na hypertextový odkaz je viditeľné.
Čítanie symbolov z /alidata/server/php-5.5.7/sbin/php-fpm... Hotovo.
[Nový LWP 2220]
[Laďovanie vlákien pomocou libthread_db zapnuté]
Použitie knižnice hostiteľa libthread_db "/lib64/libthread_db.so.1".
Jadro bolo generované pomocou 'php-fpm: pool www'.
Program ukončený signálom 11, porucha segmentácie.
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začiatok=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        {
Ak chýbajú samostatné debuginfos, použi: 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

Môžete vidieť niečo ako tieto slová:

Jadro bolo generované pomocou 'php-fpm: pool www'.
Program ukončený signálom 11, porucha segmentácie.

bt(backtrace): Uvádza volací stack

(GDB) BT
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začiatok=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 (štát=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



Prejdite si výstupnú diskusiu


Predstavujeme .gdbinit (gdb príkazové skriptovanie) poskytované v zdrojovom kóde PHP



Pozri sa na hodnoty zbacktrace a premenných

(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] šablóna ("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("globálny", "globálny") /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] šablóna ("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("globálny", "globálny") /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] šablóna ("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) tlač ((zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(gdb) printzv $1
[0xec46a28] (refcount=5) pole(1): {
    "url\0" => [0xecb2fb0] (refcount=2) reťazec(33): "/admin.php?action=index&mobile=nie"
  }
(GDB)
Riešenie

V skutočnosti som nevidel žiadne chyby, ale z logov bolo jasné, že je problém s mobilným prístupom, a po testovaní to bola naozaj chyba 502 len v prípade mobilného prístupu.

Keďže na pozadí nie je mobilná verzia, priamo som upravil admin.php zdrojový kód a pridal nasledujúci kód na prvý riadok:

Týmto spôsobom program vždy dostane žiadosť o prístup z prehliadača na PC a neprejde logickým kódom verzie pre mobilný telefón, čo je vyriešené!




Predchádzajúci:Nginx prispôsobuje stránku s chybou 404 a vracia riešenie s kódom stavu 200
Budúci:Základné použitie [ngClass] a [ngStyle] v jazyku Angular
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com