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