Чтобы помочь в отладки асинхронных программ, Boost. Asio обеспечивает поддержку отслеживания обработчиков. При включении посредством определения BOOST_ASIO_ENABLE_HANDLER_TRACKING
, Boost. Asio записывает отладку вывода в стандартный поток ошибок. Выход записывает асинхронные операции и отношения между их обработчиками.
Эта функция полезна при отладке, и вам нужно знать, как ваши асинхронные операции связаны друг с другом или каковы ожидаемые асинхронные операции. В качестве иллюстрации, вот вывод, когда вы запускаете пример HTTP Server, обрабатываете один запрос, а затем отключаете через Ctrl + C:
@asio|1298160085.070638|0*1|signal_set@0x7fff50528f40.async_wait
@asio|1298160085.070888|0*2|socket@0x7fff50528f60.async_accept
@asio|1298160085.070913|0|resolver@0x7fff50528e28.cancel
@asio|1298160118.075438|>2|ec=asio.system:0
@asio|1298160118.075472|2*3|socket@0xb39048.async_receive
@asio|1298160118.075507|2*4|socket@0x7fff50528f60.async_accept
@asio|1298160118.075527|<2|
@asio|1298160118.075540|>3|ec=asio.system:0,bytes_transferred=122
@asio|1298160118.075731|3*5|socket@0xb39048.async_send
@asio|1298160118.075778|<3|
@asio|1298160118.075793|>5|ec=asio.system:0,bytes_transferred=156
@asio|1298160118.075831|5|socket@0xb39048.close
@asio|1298160118.075855|<5|
@asio|1298160122.827317|>1|ec=asio.system:0,signal_number=2
@asio|1298160122.827333|1|socket@0x7fff50528f60.close
@asio|1298160122.827359|<1|
@asio|1298160122.827370|>4|ec=asio.system:125
@asio|1298160122.827378|<4|
@asio|1298160122.827394|0|signal_set@0x7fff50528f40.cancel
Каждая строка имеет вид:
<tag>|<timestamp>|<action>|<description>
всегда @asio
и используется для идентификации и извлечения сообщений обработчика, отслеживающих выход программы.
— секунды и микросекунды с 1 января 1970 года UTC.
принимает одну из следующих форм:
- >n
Программа вошла в число обработчика n
.
показывает аргументы обработчику.
- <n
Программа оставила обработчику номер n
.
- !n
Программа оставила обработчику номер n из-за исключения.
- ~n
Номер обработчика n
был уничтожен без вызова. Обычно это относится к незавершенным асинхронным операциям, когда сервис io_
разрушается.
- n*m
Номер обработчика n
создал новую асинхронную операцию с номером обработчика завершения m
.
показывает, какая асинхронная операция была начата.
- n
Номер обработчика n выполнял некоторую другую операцию.
показывает, как называлась функция. В настоящее время регистрируются только операции close()
и cancel()
, поскольку они могут влиять на состояние ожидающих асинхронных операций.
Там, где <описание>
показывает синхронную или асинхронную операцию, формат <объектный тип>@.<операция>
. Для записи обработчика он показывает раздельный список аргументов и их значений.
Как показано выше, каждому обработчику присваивается цифровой идентификатор. Если вывод отслеживания обработчика показывает число обработчика 0, это означает, что действие было выполнено за пределами любого обработчика.
Вывод для отслеживания обработчика может быть обработан после обработки с использованием включенного инструмента handlerviz.pl
для создания визуального представления обработчиков (требуется инструмент GraphViz dot
).