Используйте инструмент отладки gdb, чтобы начать отладку исходного кода php и swoole.

Swoole

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 в понимании для проверки

Поскольку он работает под 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 и читать исходный код в понимании😃

использованная литература

  1. Базовый дизайн PHP 7 и реализация исходного кода (Серия технологий веб-разработки)
  2. Анализ ядра PHP7
  3. Useful_commands_gdb
  4. [Исследование исходного кода Swoole] Глубокое понимание реализации сопрограммы Swoole
  5. Understand

некоторые замечания

Используйте команду c или команду continue, чтобы программа выполнялась до следующей точки останова.

Чтобы отладить функцию с помощью макроса, вам нужно развернуть макрос, чтобы получить полное имя функции, прежде чем устанавливать точку останова.

При компиляции расширения swoole нужно прикрепить отладочную информацию, передать параметр--enable-debugвыполнить

cd swoole-src
phpize
./configure --enable-debug