Введение в 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 и добавил следующий код в первую строку:
Таким образом, программа всегда получает запрос на доступ через браузер ПК, и она не будет проходить через логический код мобильной версии, решено!
|