Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 7943|Vastaus: 0

Käytä gdb:tä php-fpm poikkeusvirheen debuggaamiseen

[Kopioi linkki]
Julkaistu 23.5.2020 17.54.01 | | | |
GDB Johdanto:

GDB on tehokas UNIX-ohjelman virheenkorjaustyökalu, jonka on julkaissut GNU Open Source Organization. Jos työskentelet UNIX-alustan parissa, huomaat, että GDB on virheenkorjaustyökalu, jolla on tehokkaammat toiminnot kuin VC:n ja BCB:n graafiset debuggaajat.

ongelma

Ympäristö: Linux/PHP v5.5.7

Kun matkapuhelin pääsee tämän sivuston taustalle, klikkaa joitakin sivuja, niin 502-virhe ilmestyy, ja haluat selvittää, mikä on tarkka syy 502-virheeseen.

PHP-FPM-virheloki on seuraava:

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

Ydintiedosto

Ydintiedosto on itse asiassa muistin kuva, joka tallentaa muistin vastaavat tiedot ohjelman kaatuessa, ja sitä käytetään pääasiassa ohjelman virheenkorjaukseen. Kun ohjelma kaatuu, core-tiedosto syntyy, itse asiassa sitä pitäisi sanoa core dump -tiedostoksi, oletusgeneraattorin sijainti on samassa hakemistossa suoritettavan ohjelman kanssa, tiedoston nimi on core.***, missä *** on tietty luku.

Komento:

Ydintiedoston koko (lohkot, -c) 0
Datan seg-koko (ktavut, -d) rajaton
aikataulutuksen prioriteetti (-e) 0
tiedostokoko (lohkot, -f) rajaton
Odottavat signaalit (-i) 7271
Maksimilukittu muisti (ktavut, -l) 64
maksimimuistikoko (ktavut, -m) rajaton
Avoimet tiedostot (-n) 65535
putken koko (512 tavua, -p) 8
POSIX-viestijonot (tavut, -q) 819200
reaaliaikainen prioriteetti (-r) 0
pinon koko (ktavut, -s) 8192
suorittimen aika (sekunteja, -t) rajaton
Max User Processes (-U) 7271
virtuaalimuisti (ktavut, -v) rajaton
Tiedostolukitukset (-X) rajoittamattomat

Jos ydintiedoston koko on 0, ydintiedostoa ei voi generoida, ja se täytyy asettaa.

ulimit -c unlimited, se tarkoittaa, että ydintiedoston koko on rajaton


Asennus valmis, muistaKäynnistä php-fpm -palvelu uudelleen, komento on seuraava:



Tarkista virheloki uudelleen seuraavasti:

[23.5.2020 14:39:14] VAROITUS: [allas www] lapsi 2220 poistui signaalista 11 (SIGSEGV - ydin poistettu) 7.255225 sekunnin jälkeen käynnistyksestä
[23.5.2020 14:39:14] ILMOITUS: [uima-allas www] lapsi 2231 aloitti

Jos lokissa on sanat "SIGSEGV – core dumped", se tarkoittaa, että rore-tiedosto on onnistuneesti luotu.

Ydintiedosto luodaan verkkosivustohakemistossa, jos et tiedä, voit myös löytää ydintiedoston seuraavalla komennolla:


Palvelimeni ytimen generoima osoite on: /alidata/www/itsvse_web/core.2220

Asenna gdb

Käsky on seuraava:



gdb debug php-fpm

Valmistele .gdbinit-tiedosto

.gdbinit-tiedosto on PHP-lähdekoodin alla, ja sen täytyy olla johdonmukainen käyttämäsi PHP-version kanssa!

Tiedostoosoitteeni: /root/sh-1.5.5/php-5.5.7/.gdbinit

Lataa viimeisimmän .gdbinit-tiedoston PHP-version osoite:

Hyperlinkin kirjautuminen on näkyvissä.

gdb avaamaan ydintiedoston

Ydintiedostohakemistossa suorita seuraava komento:

[root@o itsvse_web]# gdb php-fpm -c core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Tekijänoikeus (C) 2013 Free Software Foundation, Inc.
Lisenssi GPLv3+: GNU GPL versio 3 tai uudempi <Hyperlinkin kirjautuminen on näkyvissä.
Tämä on vapaata ohjelmistoa: voit muuttaa ja jakaa sitä uudelleen.
Takuuta ei ole olemassa, siinä määrin kuin laki sallii.  Kirjoita "näytä kopiointi"
ja "näytä takuu" yksityiskohtia varten.
Tämä GDB oli konfiguroitu muotoon "x86_64-redhat-linux-gnu".
Bugiraportointiohjeet löytyvät:
<Hyperlinkin kirjautuminen on näkyvissä.
Symbolien lukeminen /alidata/server/php-5.5.7/sbin/php-fpm... Valmis.
[Uusi LWP 2220]
[Säikeiden debuggaus käyttäen libthread_db käytössä]
Käyttäen isäntä libthread_db kirjastoa "/lib64/libthread_db.so.1".
Core generoitiin 'php-fpm: pool www' -menetelmällä.
Ohjelma päättyi signaaliin 11, segmentointivirhe.
#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)
    osoitteessa /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
751        {
Erilliset debuginfot puuttuvat, käytä: 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

Voit nähdä esimerkiksi seuraavat sanat:

Core generoitiin 'php-fpm: pool www' -menetelmällä.
Ohjelma päättyi signaaliin 11, segmentointivirhe.

bt(backtrace): Listaa kutsupinon

(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)
    osoitteessa /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
#1 0x000000000075209a virtual_file_ex (tila=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)
    osoitteessa /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:1292
#2 0x000000000075308c 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") osoitteessa /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



Tarkista poistumisketju


Esittely .gdbinit (gdb-komentoskripti), joka sisältyy PHP-lähdekoodiin



Katso zbacktrace- ja muuttujaarvoja

(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(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("globaali", "globaali") /alidata/www/itsvse_web/source/function/function_core.php:1214
[0xed95218] hookscriptoutput("näyttöviesti") /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(taulukko(0)[0xec39ab0])
[0xed8d780] call_user_func(array(2)[0xeb833e8], array(0)[0xec39ab0]) /alidata/www/itsvse_web/source/function/function_core.php:1177
[0xed8bbb8] hookscript("globaali", "globaali") /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(array(0)[0xeb834f8])

(gdb) tulosta ((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)
Ratkaisu

En itse asiassa nähnyt virheitä, mutta lokeista oli selvää, että mobiilikäytössä oli ongelma, ja testauksen jälkeen kyseessä oli 502-virhe vain mobiilikäytössä.

Koska taustalla ei ole mobiiliversiota, muokkasin suoraan admin.php lähdekoodia ja lisäsin seuraavan koodin ensimmäiselle riville:

Näin ohjelma saa aina pääsypyynnön PC-selaimesta, eikä se kulje matkapuhelinversion loogisen koodin läpi, ratkaistu!




Edellinen:Nginx räätälöi 404-virhesivun ja palauttaa 200-tilakoodin ratkaisun
Seuraava:[ngClass] ja [ngStyle] peruskäyttö Angularissa
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com