Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 7943|Odpověď: 0

Použijte gdb k ladění chyby výjimky php-fpm

[Kopírovat odkaz]
Zveřejněno 23.05.2020 17:54:01 | | | |
Úvod do GDB:

GDB je výkonný nástroj pro ladění UNIXových programů vydaný organizací GNU Open Source. Pokud pracujete na platformě UNIX, zjistíte, že GDB je ladicí nástroj, který má výkonnější funkce než grafické ladiče VC a BCB.

vydat

Prostředí: Linux/PHP v5.5.7

Když mobilní telefon přistupuje na pozadí tohoto webu, klikněte na některé stránky a objeví se chyba 502, a vy chcete zjistit, co je konkrétní příčinou této chyby 502.

Chybový záznam PHP-FPM je následující:

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

Jádrový soubor

Jádrový soubor je ve skutečnosti obraz paměti, který ukládá odpovídající informace o paměti při pádu programu a slouží především k ladění programu. Když program spadne, vygeneruje se core soubor, ve skutečnosti by měl být označen za core dump soubor, výchozí generační místo je ve stejném adresáři jako spustitelný program, název souboru je core.***, kde *** je určité číslo.

Příkaz:

Velikost jádrového souboru (bloky, -c) 0
Velikost datového segmentu (kbyte, -d) neomezená
Priorita plánování (-e) 0
Velikost souboru (bloky, -f) Neomezená
Čekající návěsti (-i) 7271
Maximální uzamčená paměť (Kbytes, -L) 64
Maximální velikost paměti (kbyte, -m) neomezená
Open Files (-n) 65535
Velikost potrubí (512 bajtů, -p) 8
POSIX fronty zpráv (bajty, -q) 819200
Priorita v reálném čase (-r) 0
Velikost zásobníku (kbyte, -s) 8192
CPU čas (sekundy, -t) neomezený
MAX User Processes (-U) 7271
Virtuální paměť (kbytes, -v) Neomezená
Neomezené zámky souborů (-x)

Pokud je velikost core souboru 0, core soubor nelze vygenerovat a musíme ho nastavit.

ulimit -c unlimited, což znamená, že velikost jádrového souboru je neomezená


Příprava dokončena, pamatujRestartujte službu php-fpm, příkaz je následující:



Zkontrolujte chybový záznam znovu, následovně:

[23. května 2020 14:39:14] UPOZORNĚNÍ: [pool www] dítě 2220 vystoupilo na signálu 11 (SIGSEGV - jádro vypuštěno) po 7,255225 sekundách od startu
[23. května 2020 14:39:14] OZNÁMENÍ: [pool www] dítě 2231 začalo

Pokud log obsahuje slova "SIGSEGV – core dumped", znamená to, že soubor rore byl úspěšně vygenerován.

Jádrový soubor bude generován v adresáři webu, pokud nevíte, můžete také najít jádrový soubor pomocí následujícího příkazu:


Adresa generovaná jádrem mého serveru je: /alidata/www/itsvse_web/core.2220

Instalace gdb

Příkaz je následující:



GDB Debug PHP-FPM

Připravte soubor .gdbinit

Soubor .gdbinit je pod zdrojovým kódem PHP a musí být konzistentní s verzí PHP, kterou používáte!

Adresa mého souboru: /root/sh-1.5.5/php-5.5.7/.gdbinit

Adresa ke stažení nejnovější verze souboru .gdbinit:

Přihlášení k hypertextovému odkazu je viditelné.

GDB pro otevření jádrového souboru

V adresáři core souborů spusťte následující příkaz:

[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.
Licence GPLv3+: GNU GPL verze 3 nebo později <Přihlášení k hypertextovému odkazu je viditelné.
To je svobodný software: můžete ho měnit a znovu distribuovat.
NENÍ ZDE ŽÁDNÁ ZÁRUKA, pokud to zákon dovoluje.  Napište "zobrazit kopírování"
a "ukázat záruku" pro podrobnosti.
Tento GDB byl nakonfigurován jako "x86_64-redhat-linux-gnu".
Pro pokyny k hlášení chyb si prosím přečtěte:
<Přihlášení k hypertextovému odkazu je viditelné.
Čtení symbolů z /alidata/server/php-5.5.7/sbin/php-fpm... Hotovo.
[Nový LWP 2220]
[Ladění vlákna pomocí libthread_db povoleno]
Použití knihovny hostitele libthread_db "/lib64/libthread_db.so.1".
Core byl generován pomocí 'php-fpm: pool www'.
Program ukončen signálem 11, porucha segmentace.
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začátek=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
751        {
Chybí samostatné debuginfos, použijte: 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

Můžete vidět něco jako následující slova:

Core byl generován pomocí 'php-fpm: pool www'.
Program ukončen signálem 11, porucha segmentace.

bt(backtrace): Uvádí volací stack

(GDB) BT
#0 tsrm_realpath_r (
    path=path@entry=0x7ffdd9ebf100 "/alidata/www/itsvse_web/./source/language/mobile/lang_template.php",
    začátek=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
#1 0x000000000075209a v virtual_file_ex (stát=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)
    na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292
#2 0x000000000075308c v roce 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") na /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



Projděte si exit thread


Představujeme .gdbinit (příkazové skripty gdb) poskytované ve zdrojovém kódu PHP



Podívejte se na hodnoty zbacktrace a proměnných

(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] šablona ("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec3e50] plugin_dsu_amupper->global_footer(array(0)[0xec40028])
[0xed97080] call_user_func(array(2)[0xed6b8b0], array(0)[0xec40028]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed954b8] hookscript("globální", "globální") /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] šablona ("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec49a0] plugin_dsu_amupper->global_footer(array(0)[0xec39ab0])
[0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed8bbb8] hookscript("globální", "globální") /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] šablona ("dsu_amupper:pper_foot") /alidata/www/itsvse_web/source/plugin/dsu_amupper/pper.class.php:82
[0x7ffdd9ec54f0] plugin_dsu_amupper->global_footer(array(0)[0xeb834f8])

(GDB) tisk ((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=ne"
  }
(GDB)
Řešení

Ve skutečnosti jsem žádné chyby neviděl, ale z logů bylo jasné, že je problém s mobilním přístupem, a po testování to byla skutečně chyba 502 pouze v případě mobilního přístupu.

Protože na pozadí není mobilní verze, přímo jsem upravil admin.php zdrojový kód a přidal následující kód na první řádek:

Tímto způsobem program vždy obdrží žádost o přístup z prohlížeče na PC a neprojde logickým kódem verze pro mobilní telefon, což je vyřešeno!




Předchozí:Nginx upravuje chybovou stránku 404 a vrací řešení s kódem stavu 200
Další:Základní použití [ngClass] a [ngStyle] v Angularu
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com