Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 7943|Ответ: 0

Используйте gdb для отладки ошибки исключения php-fpm

[Скопировать ссылку]
Опубликовано 23.05.2020 17:54:01 | | | |
Введение в GDB:

GDB — это мощный инструмент отладки программ UNIX, выпущенный организацией GNU Open Source. Если вы работаете на платформе 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.***, где *** — определённое число.

Команда:

Размер ядра файла (блоки, -c) 0
Размер данных SEG (Кбайт, -D) неограниченный
Приоритет планирования (-e) 0
Размер файла (блоков, -f) неограничен
Ожидающие сигналы (-i) 7271
Максимальная заблокированная память (кбайты, -L) 64
Максимальный размер памяти (кбайт, -м) неограниченно
Открыть файлы (-n) 65535
Размер трубы (512 байт, -p) 8
Очереди сообщений POSIX (байты, -q) 819200
Приоритет в реальном времени (-R) 0
Размер стека (кбайт, -с) 8192
Время процессора (секунды, -t) неограничено
Максимальные пользовательские процессы (-u) 7271
виртуальная память (кбайт, -v) неограниченная
Блокировки файлов (-x) неограничены

Если размер основного файла равен 0, то основной файл не может быть сгенерирован, и нам нужно его установить.

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


Установка завершена, помнишьПерезапусти сервис php-fpm, команда следующая:



Проверьте журнал ошибок ещё раз, следующим образом:

[23-май-2020 14:39:14] ВНИМАНИЕ: [pool www] дочерний 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 Фонд свободного программного обеспечения, Inc.
Лицензия 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        {
Отсутствует отдельная информация об отладке, используйте следы: 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("ядро", "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(массив(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(массив(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(массив(0)[0xeb834f8])

(gdb) print ((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