Ú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é!
|