GDB įvadas:
GDB yra galingas UNIX programos derinimo įrankis, kurį išleido GNU atvirojo kodo organizacija. Jei dirbate su UNIX platforma, pamatysite, kad GDB yra derinimo įrankis, turintis galingesnes funkcijas nei VC ir BCB grafiniai derintuvai.
išduoti
Aplinka: Linux / PHP v5.5.7
Kai mobilusis telefonas pasiekia šios svetainės foną, spustelėkite kai kuriuos puslapius ir pasirodys 502 klaida ir norite sužinoti, kokia yra konkreti 502 klaidos priežastis.
PHP-FPM klaidų žurnalas yra toks:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
Pagrindinis failas
Pagrindinis failas iš tikrųjų yra atminties vaizdas, kuriame saugoma atitinkama atminties informacija, kai programa sugenda, ir daugiausia naudojamas programai derinti. Kai programa sugenda, bus sugeneruotas pagrindinis failas, iš tikrųjų reikėtų sakyti, kad tai yra pagrindinis iškelties failas, numatytoji generavimo vieta yra tame pačiame kataloge kaip ir vykdomoji programa, failo pavadinimas yra branduolys.***, kur *** yra tam tikras skaičius.
Komanda:
Pagrindinis failo dydis (blokai, -c) 0 Duomenų seg dydis (KB, -D) Neribotas Planavimo prioritetas (-e) 0 Failo dydis (blokai, -f) neribotas laukiantys signalai (-i) 7271 Maksimali užrakinta atmintis (KB, -L) 64 Maksimalus atminties dydis (KB, -m) Neribotas Atidaryti failus (-N) 65535 Vamzdžio dydis (512 baitų, -P) 8 POSIX pranešimų eilės (baitai, -q) 819200 Prioritetas realiuoju laiku (-R) 0 Rietuvės dydis (KB, -S) 8192 Procesoriaus laikas (sekundės, -t) neribotas Maksimalus vartotojo procesų skaičius (-u) 7271 Virtuali atmintis (KB, -V) neribota Failų užraktai (-x) neribotas Jei pagrindinio failo dydis yra 0, pagrindinio failo generuoti negalima, todėl turime jį nustatyti.
ulimit -c neribotas, tai reiškia, kad pagrindinio failo dydis yra neribotas
Sąranka baigta, prisimintiIš naujo paleiskite php-fpm paslaugą, komanda yra tokia:
Dar kartą patikrinkite klaidų žurnalą, kaip nurodyta toliau.
[2020 m. gegužės 23 d. 14:39:14] ĮSPĖJIMAS: [baseinas www] vaikas 2220 išėjo 11 signalu (SIGSEGV - šerdis išmestas) po 7.255225 sekundžių nuo pradžios [2020 m. gegužės 23 d. 14:39:14] PASTABA: [pool www] vaikas 2231 pradėjo Jei žurnale yra žodžiai "SIGSEGV – core dumped", tai reiškia, kad rore failas buvo sėkmingai sugeneruotas.
Pagrindinis failas bus sugeneruotas svetainės kataloge, jei nežinote, taip pat galite rasti pagrindinį failą naudodami šią komandą:
Mano serverio branduolio sugeneruotas adresas yra: /alidata/www/itsvse_web/core.2220
Įdiekite gdb
Komanda yra tokia:
GDB derinimas PHP-FPM
Paruoškite .gdbinit failą
.gdbinit failas yra pagal PHP šaltinio kodą, ir jis turi atitikti PHP versiją, kurią naudojate!
Mano failo adresas: /root/sh-1.5.5/php-5.5.7/.gdbinit
Parsisiųsti adresą naujausią php versiją .gdbinit failą:
Hipersaito prisijungimas matomas.
gdb, kad atidarytumėte pagrindinį failą
Pagrindiniame failų kataloge paleiskite šią komandą:
[root@o itsvse_web]# gdb php-fpm -c branduolys.2220 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Autorių teisės (C) 2013 Free Software Foundation, Inc. Licencija GPLv3+: GNU GPL 3 arba naujesnė versija <Hipersaito prisijungimas matomas. Tai yra laisva programinė įranga: jūs galite laisvai ją keisti ir platinti. GARANTIJOS NĖRA, tiek, kiek leidžia įstatymai. Įveskite "rodyti kopijavimą" ir "Rodyti garantiją" išsamesnės informacijos. Šis GDB buvo sukonfigūruotas kaip "x86_64-redhat-linux-gnu". Pranešimų apie klaidas instrukcijas žr.: <Hipersaito prisijungimas matomas. Skaitomi simboliai iš /alidata/server/php-5.5.7/sbin/php-fpm... atlikta. [Naujas LWP 2220] [Gijos derinimas naudojant įjungtą libthread_db] Pagrindinio kompiuterio libthread_db bibliotekos naudojimas "/lib64/libthread_db.so.1". Branduolį sukūrė "php-fpm: pool www". Programa nutraukta signalu 11, segmentavimo klaida. #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) adresu /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 751 { Trūksta atskirų debuginfos, naudokite: 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 Galite pamatyti kažką panašaus į šiuos žodžius:
Branduolį sukūrė "php-fpm: pool www". Programa nutraukta signalu 11, segmentavimo klaida. bt(backtrace): išvardija skambučių krūvą
(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) adresu /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 #1 0x000000000075209a virtual_file_ex (state=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) adresu /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292 #2 0x000000000075308c tsrm_realpath m. ( 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") at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Peržiūrėkite išėjimo giją.
Pristatome .gdbinit (gdb komandų scenarijus), pateiktą PHP šaltinio kode
Pažvelkite į zbacktrace ir kintamųjų reikšmes
(gdb) zbacktrace [0xed9f8f0] lang() /alidata/www/itsvse_web/source/function/function_core.php:444 [0xed9e2e8] lang("branduolys", "title_board_message") /alidata/www/itsvse_web/source/function/function_message.php:43 [0xed9a988] dshowmessage("mobile_template_no_found", "", masyvas(1)[0xec46a28], masyvas(0)[0xec46bc0], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed9a6d8] showmessage("mobile_template_no_found", "", masyvas(1)[0xec46a28]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed97638] šablonas("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(masyvas(0)[0xec40028]) [0xed97080] call_user_func(masyvas(2)[0xed6b8b0], masyvas(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed954b8] hookscript("globalus", "globalus") /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", "", masyvas(1)[0xec40c10], masyvas(0)[0xec76d40], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed90dd8] showmessage("mobile_template_no_found", "", masyvas(1)[0xec40c10]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed8dd38] šablonas("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(masyvas(0)[0xec39ab0]) [0xed8d780] call_user_func(masyvas(2)[0xeb833e8], masyvas(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed8bbb8] hookscript("globalus", "globalus") /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", "", masyvas(1)[0xecc0fe0], masyvas(0)[0xec76718], 0) /alidata/www/itsvse_web/source/function/function_core.php:1426 [0xed64f00] showmessage("mobile_template_no_found", "", masyvas(1)[0xecc0fe0]) /alidata/www/itsvse_web/source/function/function_core.php:618 [0xed61e60] šablonas("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(masyvas(0)[0xeb834f8])
(gdb) spausdinti ((zval *)0xec46a28) $1 = (zval *) 0xec46a28 (GDB) printzv $1 [0xec46a28] (refcount=5) masyvas(1): { "url\0" => [0xecb2fb0] (refcount=2) string(33): "/admin.php?action=index&mobile=no" } (gdb) Sprendimas
Iš tikrųjų nemačiau jokių klaidų, bet iš žurnalų buvo akivaizdu, kad kilo problema su mobiliąja prieiga, o po bandymų tai iš tikrųjų buvo 502 klaida tik mobiliosios prieigos atveju.
Kadangi fone nėra mobiliosios versijos, tiesiogiai modifikavau admin.php šaltinio kodą ir pirmoje eilutėje pridėjau šį kodą:
Tokiu būdu programa visada gaus prieigos užklausą iš kompiuterio naršyklės ir nepereis per loginį mobiliojo telefono versijos kodą, išspręstą!
|