Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 7943|Risposta: 0

Usa gdb per debug dell'errore di eccezione php-fpm

[Copiato link]
Pubblicato su 23/05/2020 17:54:01 | | | |
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!




Precedente:Nginx personalizza la pagina di errore 404 e restituisce una soluzione con codice di stato 200
Prossimo:Uso di base di [ngClass] e [ngStyle] in Angular
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com