Swoole является основным проектом php. И php, и swoole имеют определенную исследовательскую ценность. Поскольку это проект, написанный на языке C, если вы хотите начать отладку, то лучшим инструментом отладки является gdb.
Этот инструмент отладки gdb является мощным и поддерживает множество параметров.Ниже приведен краткий обзор часто используемых команд.
Скомпилируйте исходный код, чтобы добавить отладочную информацию
При компиляции отладочной информации в сгенерированный бинарный файл необходимо добавить параметр -g в компилятор gcc, например Makefile для компиляции php.
плюс-g
Параметр уже содержит отладочную информацию. -O0 — отключить оптимизацию gcc. После этой gcc-оптимизации часть отладочной информации будет потеряна во время отладки, поэтому обычно рекомендуется отключить
Таким образом, в gdb можно в любой момент просмотреть место, где в данный момент выполняется исходный код, что может значительно повысить эффективность отладки.
Посмотреть исходный код
использоватьgdb php
Start для запуска gdb для отладки программ командной строки php
использоватьlist
Команда по умолчанию находит код для выполнения в первой строке основного метода.Вы можете видеть, что строка 1186 расположена.info line
В инструкции можно просмотреть файл, где расположен код выше "sapi/cli/php_cli.c"
Откройте исходный код php в понимании для проверки
Поскольку он работает под linux, этот макрос "PHP_CLI_WIN32_NO_CONSOLE" не существует. Первая строка кода должна перейти к ветке else строки 1186, что нормально, что означает gdblist
По умолчанию команда находится в основном методе.
операция точки останова
точка останова
использоватьb
команда или полное имяbreak
Команда может установить точку останова в начале любой функции, например, точку останова в функции входа main в c/c++, просто выполните следующую команду.
b main
Эффект операции следующий
Таким образом, добавляется точка останова, и точка останова будет срабатывать в основном методе при запуске php.Просмотр существующих точек останова
использовать командуinfo b
илиinfo break
Вы можете просмотреть все текущие точки останова, эффект следующий
sapi/cli/php_cli.c:1284
добавить точку останова
Эффект следующий:
Вы можете видеть, что точка останова была успешно добавленаудалить точку останова
использовать командуdelete breakpoints 断点编号
Вы можете удалить точку останова, это можно исследовать самостоятельно
Другие операции с точками останова
Есть много других команд для этой операции точки останова, вы можете использовать командуhelp breakpoints
См. полный список команд, связанных с точками останова.
Контроль процесса
использоватьr
команда илиrun
Команда предназначена для запуска отлаженной программы php, например, для отладки этой php-команды: php test.php
<?php
// test.php
$a = '1';
echo $a;
Приведенная выше команда принимает параметр test.php, поэтому вы также можете использовать этот параметр при работе в gdb.Соответствующая команда gdb выглядит следующим образом.
run test.php
Посмотреть эффект операции:
Вы можете видеть, что точка останова, установленная в строке 1195, была успешно достигнута, что указывает на то, что php был успешно запущен в gdb.Получить отладочную информацию
Получить дизассемблированный код - режим компоновки
использовать командуlayout asm
Вы можете просмотреть код дизассемблирования, где находится текущая точка останова, которая часто используется в расширенном анализе Эффект следующий:
layout src
Вы можете переключиться на просмотр исходного кода, что очень удобно для просмотра исходного кода.Комбинированное использование layout asm позволяет сравнивать код сборки и код C в режиме реального времени, что способствует быстрому сравнению и анализу.
использовать этоctrl + x + a
команда для выхода из этого режима макета
Получить код дизассемблирования - обычный режим
Режим компоновки используется для просмотра приведенного выше ассемблерного кода, но будет открыто новое окно.Если вы хотите просмотреть только строки сборки ниже текущей точки останова, вы можете использовать более быструю команду diaplay, такую как просмотр 10 строк дизассемблирования. код под точкой останова.Используйте командуdisplay/10i $pc
, проверьте эффект следующим образом:
Но этот дисплей выведет каждую точку останова, вы можете использоватьundisplay
команда для удаления
получить значение переменной
В gdb очень удобно использовать команду p или команду print для получения значения переменной контекста, в котором находится текущая точка останова
Затем сделайте точку останова на этом 1342 и скопируйте строку в ini_entries на 1337, поэтому ini_entries должно иметь значение на 1342.
затем используйте командуp ini_entries
Просмотрите значение в переменной ini_entries
Эффект операции следующий
Значение в переменной ini_entries успешно получено в виде строки "html_errors=0\nregister_argc_argv=1\nimplicit_flush=1\noutput_buffering=0\nmax_execution_time=0\nmax_input_time=-1\n"отладка
Написать тестовый код сопрограммы swoole
// go.php
<?php
go(function () {
$a = '1';
echo $a;
});
echo '2';
Например, создайте точку останова в основной функции сопрограммы.
b zif_swoole_coroutine_create
Затем запустите с расширением swoole:run -dextension=swoole.so go.php
Эффект операции следующий
Вы можете видеть, что программа успешно взломала swoole_coroutine_create swoole.Затем вы можете использовать gdb для отладки swoole
В то же время вы также можете увидеть, что точка останова сломана в строке swoole-src/swoole_coroutine_util.cc:415, вы можете проверить, соответствует ли код в понимании
Вы можете видеть, что расположение кода в понимании в порядке, поэтому вы можете отлаживать в gdb и читать исходный код в понимании😃использованная литература
- Базовый дизайн PHP 7 и реализация исходного кода (Серия технологий веб-разработки)
- Анализ ядра PHP7
- Useful_commands_gdb
- [Исследование исходного кода Swoole] Глубокое понимание реализации сопрограммы Swoole
- Understand
некоторые замечания
Используйте команду c или команду continue, чтобы программа выполнялась до следующей точки останова.
Чтобы отладить функцию с помощью макроса, вам нужно развернуть макрос, чтобы получить полное имя функции, прежде чем устанавливать точку останова.
При компиляции расширения swoole нужно прикрепить отладочную информацию, передать параметр--enable-debug
выполнить
cd swoole-src
phpize
./configure --enable-debug