Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 7943|Відповідь: 0

Використовуйте gdb для налагодження помилки exception 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
Максимальна заблокована пам'ять (кбайт, -л) 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, використовуйте так: 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(масив(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("глобальний", "глобальний") /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", "", масив(1)[0xecc0fe0], масив(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) друк ((zval *)0xec46a28)
$1 = (zval *) 0xec46a28
(GDB) PRINTZV $1
[0xec46a28] (refcount=5) масив(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