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