Introducere GDB:
GDB este un instrument puternic de depanare a programelor UNIX lansat de organizația GNU Open Source. Dacă lucrezi pe platforma UNIX, vei descoperi că GDB este un instrument de depanare care are funcții mai puternice decât depanatorii grafici VC și BCB.
problemă
Mediu: Linux/PHP v5.5.7
Când telefonul mobil accesează fundalul acestui site, faceți clic pe câteva pagini și va apărea eroarea 502, dorind să aflați care este motivul specific al erorii 502.
Jurnalul de erori PHP-FPM este următorul:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
Fișier de bază
Fișierul de bază este de fapt o imagine a memoriei, care stochează informațiile corespunzătoare ale memoriei când programul se blochează și este folosit în principal pentru depanarea programului. Când programul se blochează, va fi generat un fișier core, de fapt, ar trebui spus că este un fișier core dump, locația implicită de generare este în același director cu programul executabil, numele fișierului este core.***, unde *** este un anumit număr.
Comanda:
Dimensiunea fișierului de bază (blocuri, -c) 0 Data Seg Dimensiunea (Kbytes, -D) nelimitată Prioritate de programare (-e) 0 Dimensiunea fișierului (Blocks, -F) nelimitată Semnale în așteptare (-i) 7271 Memorie blocată maximă (kbytes, -l) 64 Dimensiunea maximă a memoriei (kbytes, -m) nelimitată Fișiere deschise (-N) 65535 Dimensiunea țevii (512 octeți, -p) 8 Cozi de mesaje POSIX (octeți, -q) 819200 Prioritate în timp real (-r) 0 Dimensiunea stivei (kbytes, -s) 8192 Timp CPU (secunde, -t) nelimitat Procese maxime de utilizator (-U) 7271 Memorie virtuală (kbytes, -v) nelimitată Blocaje de fișiere (-x) nelimitate Dacă dimensiunea fișierului de bază este 0, fișierul de bază nu poate fi generat și trebuie să-l setăm.
ulimit -c unlimited, înseamnă că dimensiunea fișierului de bază este nelimitată
Pregătirea este completă, amintește-țiRepornește serviciul php-fpm, comanda este următoarea:
Verifică din nou jurnalul de erori, după cum urmează:
[23-mai-2020 14:39:14] ATENȚIE: [pool www] copilul 2220 a ieșit la semnalul 11 (SIGSEGV - nucleu evacuat) după 7,255225 secunde de la pornire [23-mai-2020 14:39:14] NOTIFICARE: [pool www] copilul 2231 a început Dacă jurnalul conține cuvintele "SIGSEGV – core dumped", înseamnă că fișierul rore a fost generat cu succes.
Fișierul de bază va fi generat în directorul site-ului, dacă nu știi, poți găsi și fișierul de bază cu următoarea comandă:
Adresa generată de nucleul serverului meu este: /alidata/www/itsvse_web/core.2220
Instalează gdb
Comanda este următoarea:
depanare gdb php-fpm
Pregătește fișierul .gdbinit
Fișierul .gdbinit este sub codul sursă PHP și trebuie să fie compatibil cu versiunea php pe care o folosești!
Adresa fișierului meu: /root/sh-1.5.5/php-5.5.7/.gdbinit
Adresa de descărcare a celei mai recente versiuni php a fișierului .gdbinit:
Autentificarea cu hyperlink este vizibilă.
GDB pentru a deschide fișierul de bază
În directorul de fișiere de bază, rulează următoarea comandă:
[root@o itsvse_web]# GDB PHP-FPM -C Core.2220 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Drepturi de autor (C) 2013 Free Software Foundation, Inc. Licență GPLv3+: GNU GPL versiunea 3 sau ulterioară <Autentificarea cu hyperlink este vizibilă. Acesta este software liber: ești liber să-l modifici și să-l redistribui. NU EXISTĂ NICIO GARANȚIE, în măsura permisă de lege. Scrie "afișează copierea" și "arată garanția" pentru detalii. Acest GDB a fost configurat ca "x86_64-redhat-linux-gnu". Pentru instrucțiuni de raportare a bug-urilor, vă rugăm să consultați: <Autentificarea cu hyperlink este vizibilă. Citirea simbolurilor de la /alidata/server/php-5.5.7/sbin/php-fpm... gata. [Noul LWP 2220] [Depanarea firului folosind libthread_db activată] Folosirea gazdei libthread_db bibliotecii "/lib64/libthread_db.so.1". Core a fost generat de 'php-fpm: pool www'. Program încheiat cu semnalul 11, defecțiune de segmentare. #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) la /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 751 { Dacă lipsesc debuginfos separate, folosiț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 Poți vedea ceva de genul următorului cuvânt:
Core a fost generat de 'php-fpm: pool www'. Program încheiat cu semnalul 11, defecțiune de segmentare. bt(backtrace): Listează stack-ul de apeluri
(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) la /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 #1 0x000000000075209a în virtual_file_ex (stare=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) la /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292 #2 0x000000000075308c în 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") la /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Revizuiește firul de ieșire
Introducerea .gdbinit (scripting de comenzi gdb) oferit în codul sursă PHP
Uită-te la zbacktrace și la valorile variabilelor
(gdb) zbacktrace [0xed9f8f0] lang() /alidata/www/itsvse_web/source/function/function_core.php:444 [0xed9e2e8] lang("nucleu", "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] șablon("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(aranjament(0)[0xec40028]) [0xed97080] call_user_func(array(2)[0xed6b8b0], array(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed954b8] hookscript("global", "global") /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] șablon("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(aranjament(0)[0xec39ab0]) [0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed8bbb8] hookscript("global", "global") /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] șablon("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(aranjament(0)[0xeb834f8])
(gdb) print ((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) Soluție
De fapt, nu am văzut erori, dar era evident din jurnale că era o problemă cu accesul mobil, iar după testare, era într-adevăr o eroare 502 doar în cazul accesului mobil.
Pentru că nu există o versiune mobilă în fundal, am modificat direct codul sursă admin.php și am adăugat următorul cod pe prima linie:
Astfel, programul va primi întotdeauna o cerere de acces din browserul PC-ului și nu va parcurge codul logic al versiunii de telefon mobil, rezolvat!
|