Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 7943|Respuesta: 0

Usa gdb para depurar el error de excepción php-fpm

[Copiar enlace]
Publicado en 23/5/2020 17:54:01 | | | |
Introducción a GDB:

GDB es una potente herramienta de depuración de programas UNIX lanzada por la organización GNU Open Source. Si trabajas en la plataforma UNIX, verás que GDB es una herramienta de depuración que tiene funciones más potentes que los depuradores gráficos de VC y BCB.

emitir

Entorno: Linux/PHP v5.5.7

Cuando el teléfono móvil accede al segundo plano de este sitio, haz clic en algunas páginas y aparecerá el error 502, y querrás saber cuál es la razón específica del error 502.

El registro de errores de php-fpm es el siguiente:

WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start

Archivo núcleo

El archivo núcleo es en realidad una imagen de memoria, que almacena la información correspondiente de la memoria cuando el programa se bloquea, y se utiliza principalmente para depurar el programa. Cuando el programa se bloquea, se genera un archivo núcleo; de hecho, debe decirse que es un archivo de volcado núcleo, la ubicación de generación predeterminada está en el mismo directorio que el programa ejecutable, el nombre del archivo es core.***, donde *** es un cierto número.

Mandar:

Tamaño del archivo principal (bloques, -c) 0
Data SEG Tamaño (kbytes, -d) ilimitado
Prioridad de programación (-e) 0
Tamaño del archivo (bloques, -f) ilimitado
Señales pendientes (-i) 7271
Memoria bloqueada máxima (kbytes, -l) 64
Tamaño máximo de memoria (kbytes, -m) ilimitado
Archivos abiertos (-n) 65535
Tamaño de tubería (512 bytes, -p) 8
Colas de mensajes POSIX (bytes, -q) 819200
Prioridad en tiempo real (-r) 0
Tamaño de la pila (kbytes, -s) 8192
Tiempo de CPU (segundos, -t) Ilimitado
Procesos de usuario máximo (-U) 7271
Memoria virtual (kbytes, -v) ilimitada
Bloqueos de archivo (-x) ilimitados

Si el tamaño del archivo núcleo es 0, el archivo núcleo no puede generarse y necesitamos configurarlo.

ulimit -c ilimitado, significa que el tamaño del archivo core es ilimitado


Montaje completado, recuerdaReiniciar el servicio php-fpm, el comando es el siguiente:



Revisa de nuevo el registro de errores, como sigue:

[23-May-2020 14:39:14] ADVERTENCIA: [pool www] el hijo 2220 salió en la señal 11 (SIGSEGV - núcleo descargado) a los 7,255225 segundos desde el inicio
[23-May-2020 14:39:14] AVISO: [pool www] niño 2231 iniciado

Si el registro contiene las palabras "SIGSEGV – core dumped", significa que el archivo rore ha sido generado con éxito.

El archivo central se generará en el directorio del sitio web; si no lo sabes, también puedes encontrar el archivo principal con el siguiente comando:


La dirección generada por el núcleo de mi servidor es: /alidata/www/itsvse_web/core.2220

Instalar gdb

El comando es el siguiente:



depuración gdb php-fpm

Prepara el archivo .gdbinit

El archivo .gdbinit está bajo el código fuente de PHP, ¡y debe ser consistente con la versión php que estás usando!

Mi dirección de archivo: /root/sh-1.5.5/php-5.5.7/.gdbinit

Descarga la dirección de la última versión php del archivo .gdbinit:

El inicio de sesión del hipervínculo es visible.

GDB para abrir el archivo central

En el directorio principal del archivo, ejecuta el siguiente comando:

[root@o itsvse_web]# GDB php-fpm -c core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Derechos de autor (C) 2013 Free Software Foundation, Inc.
Licencia GPLv3+: GNU GPL versión 3 o posterior <El inicio de sesión del hipervínculo es visible.
Esto es software libre: eres libre de cambiarlo y redistribuirlo.
NO HAY GARANTÍA, en la medida permitida por ley.  Escribe "mostrar copia"
y "mostrar garantía" para más detalles.
Este GDB estaba configurado como "x86_64-redhat-linux-gnu".
Para instrucciones para reportar errores, por favor consulta:
<El inicio de sesión del hipervínculo es visible.
Leer símbolos de /alidata/server/php-5.5.7/sbin/php-fpm... Hecho.
[Nuevo LWP 2220]
[Depuración de hilos usando libthread_db activada]
Usando la biblioteca host libthread_db "/lib64/libthread_db.so.1".
Core fue generado por 'php-fpm: pool www'.
Programa terminado con señal 11, fallo de segmentación.
#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        {
Falta debuginfos separadas, usar: 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

Puedes ver algo así como las siguientes palabras:

Core fue generado por 'php-fpm: pool www'.
Programa terminado con señal 11, fallo de segmentación.

bt(backtrace): Lista la pila de llamadas

(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 en virtual_file_ex (estado=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)
    at /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292
#2 0x000000000075308c en 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") en /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



Revisa el hilo de salida


Introducción de .gdbinit (scripting de comandos gdb) proporcionado en el código fuente de PHP



Mira el zbacktrace y los valores de variables

(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] plantilla("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(matriz(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] plantilla("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(matriz(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] plantilla("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(matriz(0)[0xeb834f8])

(GDB) Impresión ((Zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(GDB) PrintZV $1
[0xec46a28] (refcount=5) array(1): {
    "url\0" => [0xecb2fb0] (refcount=2) cadena(33): "/admin.php?action=index&mobile=no"
  }
(GDB)
Solución

En realidad no vi ningún error, pero era evidente por los registros que había un problema con el acceso móvil, y tras las pruebas, efectivamente era un error 502 solo en el caso del acceso móvil.

Como no hay versión móvil en segundo plano, modifiqué directamente el código fuente admin.php y añadí el siguiente código en la primera línea:

De esta manera, el programa siempre recibirá una solicitud de acceso desde el navegador del PC y no pasará por el código lógico de la versión móvil, ¡solucionado!




Anterior:Nginx personaliza la página de error 404 y devuelve una solución con código de estado 200
Próximo:Uso básico de [ngClass] y [ngStyle] en Angular
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com