Introdução ao GDB:
GDB é uma poderosa ferramenta de depuração de programas UNIX lançada pela GNU Open Source Organization. Se você está trabalhando na plataforma UNIX, verá que o GDB é uma ferramenta de depuração que possui funções mais poderosas do que os depuradores gráficos do VC e BCB.
questão
Ambiente: Linux/PHP v5.5.7
Quando o celular acessar o segundo plano deste site, clique em algumas páginas e o erro 502 aparecerá, e você quer descobrir qual é a razão específica do erro 502.
O registro de erros do PHP-FPM é o seguinte:
WARNING: [pool www] child 11274 exited on signal 11 (SIGSEGV) after 0.089068 seconds from start
Arquivo núcleo
O arquivo núcleo é, na verdade, uma imagem da memória, que armazena as informações correspondentes da memória quando o programa trava, e é usada principalmente para depurar o programa. Quando o programa trava, um arquivo core será gerado, na verdade, ele deve ser dito como um arquivo de despejo core, a localização padrão de geração está no mesmo diretório do programa executável, o nome do arquivo é core.***, onde *** é um certo número.
Comando:
Tamanho do arquivo principal (blocos, -c) 0 Tamanho do Data Seg (kbytes, -d) ilimitado Prioridade de escalonamento (-e) 0 Tamanho do arquivo (blocos, -f) ilimitado Sinais pendentes (-i) 7271 Memória Máxima Travada (Kbytes, -L) 64 Tamanho máximo de memória (kbytes, -m) ilimitado Arquivos abertos (-N) 65535 Tamanho do tubo (512 bytes, -p) 8 Filas de mensagens POSIX (bytes, -q) 819200 Prioridade em tempo real (-r) 0 Tamanho da pilha (kbytes, -s) 8192 Tempo de CPU (segundos, -t) ilimitado Processos de usuário máximo (-u) 7271 Memória Virtual (kbytes, -v) ilimitada Bloqueios de arquivo (-x) ilimitados Se o tamanho do arquivo core for 0, o arquivo core não pode ser gerado, e precisamos defini-lo.
ulimit -c ilimitado, significa que o tamanho do arquivo core é ilimitado
Configuração concluída, lembre-seReinicie o serviço php-fpm, o comando é o seguinte:
Verifique novamente o registro de erros, conforme segue:
[23-Mai-2020 14:39:14] AVISO: [pool www] criança 2220 saiu no sinal 11 (SIGSEGV - núcleo descarregado) após 7,255225 segundos após o início [23-Mai-2020 14:39:14] AVISO: [pool www] criança 2231 iniciada Se o log contém as palavras "SIGSEGV – core dumped", significa que o arquivo rore foi gerado com sucesso.
O arquivo core será gerado no diretório do site, caso você não saiba, também pode encontrar o arquivo core com o seguinte comando:
O endereço gerado pelo núcleo do meu servidor é: /alidata/www/itsvse_web/core.2220
Instalar o gdb
O comando é o seguinte:
depuração GDB PHP-FPM
Prepare o arquivo .gdbinit
O arquivo .gdbinit está no código-fonte do PHP, e deve ser consistente com a versão PHP que você está usando!
Meu endereço de arquivo: /root/sh-1.5.5/php-5.5.7/.gdbinit
Endereço do download da versão mais recente em PHP do arquivo .gdbinit:
O login do hiperlink está visível.
GDB para abrir o arquivo central
No diretório principal do arquivo, execute o seguinte comando:
[root@o itsvse_web]# GDB php-fpm -c Core.2220 GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7 Direitos autorais (C) 2013 Free Software Foundation, Inc. Licença GPLv3+: GNU GPL versão 3 ou posterior <O login do hiperlink está visível. Este é software livre: você é livre para alterá-lo e redistribuí-lo. NÃO HÁ GARANTIA, na medida permitida por lei. Digite "mostrar cópia" e "mostrar garantia" para detalhes. Esse GDB foi configurado como "x86_64-redhat-linux-gnu". Para instruções de reporte de bugs, por favor, consulte: <O login do hiperlink está visível. Lendo símbolos de /alidata/server/php-5.5.7/sbin/php-fpm... Pronto. [Novo LWP 2220] [Depuração de thread usando libthread_db ativada] Usando a biblioteca host libthread_db "/lib64/libthread_db.so.1". O Core foi gerado por 'php-fpm: pool www'. Programa terminado com o sinal 11, falha de segmentação. #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 separados, use: 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 Você pode ver algo como as seguintes palavras:
O Core foi gerado por 'php-fpm: pool www'. Programa terminado com o sinal 11, falha de segmentação. bt(backtrace): Lista a pilha de chamadas
(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 em 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 em 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") em /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954
Revise o tópico de saída
Introdução ao .gdbinit (script de comandos gdb) fornecido no código-fonte do PHP
Olhe para o zbacktrace e os valores das variáveis
(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(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] template("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] template("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) Impressão ((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ção
Na verdade, não vi nenhum erro, mas ficou óbvio pelos logs que havia um problema com o acesso móvel, e depois de testar, era realmente um erro 502 apenas no caso do acesso móvel.
Como não há uma versão móvel em segundo plano, modifiquei diretamente o código-fonte admin.php e adicionei o seguinte código na primeira linha:
Dessa forma, o programa sempre receberá uma solicitação de acesso do navegador do PC, e ele não passará pelo código lógico da versão do celular, resolvido!
|