Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 7943|Отговор: 0

Използвайте gdb за отстраняване на грешка от изключение от php-fpm

[Копирай линк]
Публикувано в 23.05.2020 г. 17:54:01 ч. | | | |
Въведение в GDB:

GDB е мощен UNIX инструмент за дебъгване на програми, пуснат от GNU Open Source Organization. Ако работите на UNIX платформата, ще откриете, че GDB е инструмент за отстраняване на грешки с по-мощни функции от графичните дебъгери на VC и BCB.

Въпрос

Среда: Linux/PHP v5.5.7

Когато мобилният телефон отвори фона на този сайт, кликнете върху някои страници и ще се появи грешка 502, като искате да разберете каква е конкретната причина за грешката 502.

Логът на грешките на PHP-FPM е следният:

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

Основен файл

Основният файл всъщност е образ на паметта, който съхранява съответната информация от паметта при срив на програмата и се използва основно за отстраняване на грешки. Когато програмата се срине, се генерира основен файл, всъщност трябва да се каже, че е core dump файл, като по подразбиране мястото за генериране е в същата директория като изпълняемата програма, името на файла е core.***, където *** е определено число.

Команда:

Размер на ядрото на файла (блокове, -c) 0
размер на данните SEG (kbytes, -d) неограничен
Приоритет на планиране (-e) 0
Размер на файла (блокове, -f) неограничен
Чакащи сигнали (-i) 7271
Максимална заключена памет (kbyte, -L) 64
Максимален размер на паметта (kbytes, -m) неограничен
Отвори файлове (-n) 65535
Размер на тръбата (512 байта, -p) 8
POSIX опашки за съобщения (байтове, -q) 819200
Приоритет в реално време (-R) 0
Размер на стека (kbytes, -s) 8192
Време на процесора (секунди, -t) неограничено
Максимални потребителски процеси (-u) 7271
виртуална памет (kbytes, -v) неограничена
заключване на файлове (-x) неограничени

Ако основният размер на файла е 0, основният файл не може да бъде генериран и трябва да го зададем.

ulimit -c unlimited, означава, че размерът на основния файл е неограничен


Настройката е завършена, помниРестартирай php-fpm услугата, командата е следната:



Проверете отново лога за грешки, както следва:

[23-май-2020 14:39:14] ВНИМАНИЕ: [pool www] child 2220 излезе на сигнал 11 (SIGSEGV - ядрото е изхвърлено) след 7.255225 секунди преди старта
[23-май-2020 14:39:14] ИЗВЕСТИЕ: [pool www] дете 2231 започна

Ако логът съдържа думите "SIGSEGV – core dumped", това означава, че rore файлът е успешно генериран.

Основният файл ще бъде генериран в директорията на уебсайта, ако не знаете, можете да намерите основния файл с следната команда:


Адресът, генериран от ядрото на моя сървър, е: /alidata/www/itsvse_web/core.2220

Инсталиране на gdb

Командата е следната:



gdb debug php-fpm

Подгответе .gdbinit файла

Файлът .gdbinit е под изходния код на PHP и трябва да е съвместим с php версията, която използвате!

Адресът на файла ми: /root/sh-1.5.5/php-5.5.7/.gdbinit

Изтеглете адреса на най-новата php версия на .gdbinit файл:

Входът към хиперлинк е видим.

gdb за отваряне на основния файл

В основната файлова директория изпълнете следната команда:

[root@o itsvse_web]# gdb php-fpm -c core.2220
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Авторски права (C) 2013 Фондация за свободен софтуер, Инк.
Лиценз GPLv3+: GNU GPL версия 3 или по-нова <Входът към хиперлинк е видим.
Това е свободен софтуер: свободен си да го променяш и разпространяваш.
НЯМА ГАРАНЦИЯ, в степента, която е разрешена от закона.  Напишете "показване на копиране"
и "покажи гаранция" за подробности.
Този GDB беше конфигуриран като "x86_64-redhat-linux-gnu".
За инструкции за докладване на бъгове, моля, вижте:
<Входът към хиперлинк е видим.
Четене на символи от /alidata/server/php-5.5.7/sbin/php-fpm... Готово.
[Нов LWP 2220]
[Отстраняване на грешки в нишка с libthread_db активирано]
Използвайки библиотеката на хоста libthread_db "/lib64/libthread_db.so.1".
Ядрото беше генерирано чрез 'php-fpm: pool www'.
Програмата приключи със сигнал 11, грешка в сегментацията.
#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)
    на /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
751        {
Липсват отделни debuginfos, използвайте : 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

Можете да видите нещо като следните думи:

Ядрото беше генерирано чрез 'php-fpm: pool www'.
Програмата приключи със сигнал 11, грешка в сегментацията.

bt(backtrace): Показва стека за повиквания

(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)
    на /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c:751
#1 0x000000000075209a в virtual_file_ex (състояние=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)
    на /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") на /root/sh-1.5.5/php-5.5.7/TSRM/tsrm_virtual_cwd.c :1954



Прегледайте темата за изход


Въвеждаме .gdbinit (gdb команден скрипт), предоставен в PHP изходния код



Погледни стойностите на zbacktrace и променливите

(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("глобален", "глобален") /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(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("глобален", "глобален") /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) печат ((zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(GDB) PRINTZV $1
[0xec46a28] (refcount=5) array(1): {
    "URL\0" => [0xecb2fb0] (refcount=2) низ(33): "/admin.php?action=index&mobile=no"
  }
(gdb)
Решение

Всъщност не видях никакви грешки, но от логовете беше очевидно, че има проблем с мобилния достъп, и след тестове наистина беше 502 грешка само при мобилен достъп.

Тъй като няма мобилна версия във фонов режим, директно промених изходния код на admin.php и добавих следния код на първия ред:

По този начин програмата винаги ще получава заявка за достъп от браузъра на компютъра и няма да преминава през логичния код на мобилната версия, решено!




Предишен:Nginx персонализира страницата с грешка 404 и връща решение с код за статус 200
Следващ:Основна употреба на [ngClass] и [ngStyle] в Angular
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com