Introduzione a GDB:
GDB è uno strumento potente per il debug dei programmi UNIX rilasciato dalla GNU Open Source Organization. Se lavori sulla piattaforma UNIX, scoprirai che GDB è uno strumento di debug che ha funzioni più potenti rispetto ai debugger grafici di VC e BCB.
questione
Ambiente: Linux/PHP v5.5.7
Quando il telefono mobile accede allo sfondo di questo sito, clicca su alcune pagine e apparirà l'errore 502, e vorrai scoprire qual è la ragione specifica dell'errore 502.
Il registro degli errori PHP-FPM è il seguente:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
File core
Il file core è in realtà un'immagine di memoria, che memorizza le informazioni corrispondenti della memoria quando il programma va in crash, ed è principalmente utilizzato per fare il debug del programma. Quando il programma si blocca, viene generato un file core, infatti dovrebbe essere detto un file di dump core, la posizione di generazione predefinita è nella stessa directory del programma eseguibile, il nome del file è core.***, dove *** è un certo numero.
Comando:
Dimensione del file core (blocchi, -c) 0 Data SEG Dimensione (Kbytes, -D) Illimitata Priorità di pianificazione (-e) 0 Dimensione file (blocchi, -f) Illimitata Segnali in attesa (-i) 7271 Memoria bloccata massima (kbyte, -l) 64 Dimensione massima della memoria (kbytes, -m) illimitata Fascicoli aperti (-n) 65535 Dimensione del tubo (512 byte, -p) 8 Code di messaggi POSIX (byte, -q) 819200 Priorità in tempo reale (-r) 0 Dimensione dello stack (kbytes, -s) 8192 Tempo CPU (secondi, -t) Illimitato Processi utente massimi (-u) 7271 Memoria virtuale (kbytes, -v) illimitata Blocchi File (-x) Illimitati Se la dimensione del file core è 0, il file core non può essere generato e dobbiamo impostarlo.
ulimit -c illimitato, significa che la dimensione del file core è illimitata
Preparazione completata, ricordateRiavvia il servizio php-fpm, il comando è il seguente:
Controlla di nuovo il registro errori, come segue:
[23-maggio-2020 14:39:14] ATTENZIONE: [pool www] il figlio 2220 è uscito al segnale 11 (SIGSEGV - core dumpato) dopo 7,255225 secondi dall'inizio [23-maggio-2020 14:39:14] AVÍS: [piscina www] bambino 2231 iniziato Se il log contiene le parole "SIGSEGV – core dumped", significa che il file rore è stato generato con successo.
Il file core verrà generato nella directory del sito web; se non lo sai, puoi anche trovare il file core con il seguente comando:
L'indirizzo generato dal core del mio server è: /alidata/www/itsvse_web/core.2220
Installa gdb
Il comando è il seguente:
GDB Debug PHP-FPM
Prepara il file .gdbinit
Il file .gdbinit è sotto il codice sorgente PHP e deve essere coerente con la versione PHP che stai usando!
Il mio indirizzo file: /root/sh-1.5.5/php-5.5.7/.gdbinit
Scarica l'indirizzo dell'ultima versione PHP del file .gdbinit:
Il login del link ipertestuale è visibile.
GDB per aprire il file core
Nella directory core file, esegui il seguente comando:
[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. Licenza GPLv3+: GNU GPL versione 3 o successiva <Il login del link ipertestuale è visibile. Questo è software libero: sei libero di modificarlo e ridistribuirlo. NON C'È ALCUNA GARANZIA, nella misura consentita dalla legge. Digita "mostra copia" e "mostra garanzia" per i dettagli. Questo GDB era configurato come "x86_64-redhat-linux-gnu". Per le istruzioni per segnalare bug, si prega di consultare: <Il login del link ipertestuale è visibile. Leggendo i simboli da /alidata/server/php-5.5.7/sbin/php-fpm... Fatto. [Nuovo LWP 2220] [Debug thread usando libthread_db abilitato] Uso della libreria host libthread_db "/lib64/libthread_db.so.1". Core è stato generato da 'php-fpm: pool www'. Programma terminato con segnale 11, guasto di segmentazione. #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) at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 751 { Mancanti debuginfos separati, usa: 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 Puoi vedere qualcosa come le seguenti parole:
Core è stato generato da 'php-fpm: pool www'. Programma terminato con segnale 11, guasto di segmentazione. bt(backtrace): Elenca la pila di chiamate
(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) at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751 #1 0x000000000075209a in virtual_file_ex (stato=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) a /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292 #2 0x000000000075308c in 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") a /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Rivedi il thread di uscita
Introduzione di .gdbinit (script di comandi gdb) fornito nel codice sorgente PHP
Guarda la zbacktrace e i valori delle variabili
(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] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(schiera(0)[0xec40028]) [0xed97080] call_user_func(array(2)[0xed6b8b0], array(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed954b8] hookscript("globale", "globale") /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] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(schiera(0)[0xec39ab0]) [0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177 [0xed8bbb8] hookscript("globale", "globale") /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] template("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82 [0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(schiera(0)[0xeb834f8])
(GDB) Stampa ((ZVAL *)0xec46a28) $1 = (zval *) 0xec46a28 (GDB) PrintZV $1 [0xec46a28] (refcount=5) array(1): { "URL\0" => [0xecb2fb0] (refcount=2) stringa(33): "/admin.php?action=index&mobile=no" } (gdb) Soluzione
In realtà non ho visto errori, ma dai log era ovvio che c'era un problema con l'accesso mobile, e dopo i test si trattava effettivamente di un errore 502 solo nel caso di accesso mobile.
Poiché non c'è una versione mobile in background, ho modificato direttamente il codice sorgente admin.php aggiungendo il seguente codice alla prima riga:
In questo modo, il programma riceverà sempre una richiesta di accesso dal browser del PC, e non passerà attraverso il codice logico della versione per cellulare, risolto!
|