Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 7943|Resposta: 0

Use gdb para depurar erro de exceção php-fpm

[Copiar link]
Publicado em 23/05/2020 17:54:01 | | | |
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!




Anterior:A Nginx personaliza a página de erro 404 e retorna uma solução de código de status 200
Próximo:Uso básico de [ngClass] e [ngStyle] em Angular
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com