Ú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!
|