Swoole является основным проектом php. И php, и swoole имеют определенную исследовательскую ценность. Поскольку это проект, написанный на языке C, если вы хотите начать отладку, то лучшим инструментом отладки является gdb.
Этот инструмент отладки gdb является мощным и поддерживает множество параметров.Ниже приведен краткий обзор часто используемых команд.
Скомпилируйте исходный код, чтобы добавить отладочную информацию
При компиляции отладочной информации в сгенерированный бинарный файл необходимо добавить параметр -g в компилятор gcc, например Makefile для компиляции php.
-gПараметр уже содержит отладочную информацию. -O0 — отключить оптимизацию gcc. После этой gcc-оптимизации часть отладочной информации будет потеряна во время отладки, поэтому обычно рекомендуется отключить
Таким образом, в gdb можно в любой момент просмотреть место, где в данный момент выполняется исходный код, что может значительно повысить эффективность отладки.
Посмотреть исходный код
gdb phpStart для запуска gdb для отладки программ командной строки php
использоватьlistКоманда по умолчанию находит код для выполнения в первой строке основного метода.Вы можете видеть, что строка 1186 расположена.info lineВ инструкции можно просмотреть файл, где расположен код выше "sapi/cli/php_cli.c"
Откройте исходный код php в понимании для проверки
listПо умолчанию команда находится в основном методе.
операция точки останова
точка останова
использоватьbкоманда или полное имяbreakКоманда может установить точку останова в начале любой функции, например, точку останова в функции входа main в c/c++, просто выполните следующую команду.
b main
Эффект операции следующий
Просмотр существующих точек останова
использовать команду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
Посмотреть эффект операции:
Получить отладочную информацию
Получить дизассемблированный код - режим компоновки
использовать командуlayout asmВы можете просмотреть код дизассемблирования, где находится текущая точка останова, которая часто используется в расширенном анализе Эффект следующий:
layout srcВы можете переключиться на просмотр исходного кода, что очень удобно для просмотра исходного кода.ctrl + x + aкоманда для выхода из этого режима макета
Получить код дизассемблирования - обычный режим
Режим компоновки используется для просмотра приведенного выше ассемблерного кода, но будет открыто новое окно.Если вы хотите просмотреть только строки сборки ниже текущей точки останова, вы можете использовать более быструю команду diaplay, такую как просмотр 10 строк дизассемблирования. код под точкой останова.Используйте командуdisplay/10i $pc, проверьте эффект следующим образом:
Но этот дисплей выведет каждую точку останова, вы можете использоватьundisplayкоманда для удаления
получить значение переменной
В gdb очень удобно использовать команду p или команду print для получения значения переменной контекста, в котором находится текущая точка останова
Затем сделайте точку останова на этом 1342 и скопируйте строку в ini_entries на 1337, поэтому ini_entries должно иметь значение на 1342.
затем используйте командуp ini_entriesПросмотрите значение в переменной ini_entries
Эффект операции следующий
отладка
Написать тестовый код сопрограммы swoole
// go.php
<?php
go(function () {
$a = '1';
echo $a;
});
echo '2';
Например, создайте точку останова в основной функции сопрограммы.
b zif_swoole_coroutine_create
Затем запустите с расширением swoole:run -dextension=swoole.so go.php
Эффект операции следующий
Затем вы можете использовать gdb для отладки swoole
В то же время вы также можете увидеть, что точка останова сломана в строке swoole-src/swoole_coroutine_util.cc:415, вы можете проверить, соответствует ли код в понимании
использованная литература
- Базовый дизайн PHP 7 и реализация исходного кода (Серия технологий веб-разработки)
- Анализ ядра PHP7
- Useful_commands_gdb
- [Исследование исходного кода Swoole] Глубокое понимание реализации сопрограммы Swoole
- Understand
некоторые замечания
Используйте команду c или команду continue, чтобы программа выполнялась до следующей точки останова.
Чтобы отладить функцию с помощью макроса, вам нужно развернуть макрос, чтобы получить полное имя функции, прежде чем устанавливать точку останова.
При компиляции расширения swoole нужно прикрепить отладочную информацию, передать параметр--enable-debugвыполнить
cd swoole-src
phpize
./configure --enable-debug