调用跟踪

为了帮助调试异步程序,asio提供了调用跟踪。一旦你开启了 ASIO_ENABLE_HANDLER_TRACKING,Asio把调试信息输出到标准报错系统。它会记录异步操作和它们与回调的联系。

这一特性对于调试时了解你的异步程序是如何运行的是很有用的。作为例子,这里有一个HTTP服务器的实现:处理一个简单的请求,中止并粘贴输出:

@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>

<tag>标签往往是@asio,用来标识aiso系统输出的消息。

<timestamp>输出的是从1970年UTC时间一月一号开始的时间,单位是秒。

<action>标签为如下的形式:

  • >n n号回调进入执行链中,<description>标签表示参数
  • <n 程序还剩下n号回调
  • !n n号回调触发了异常
  • ~n n号回调还未调用就被销毁了。这通常发生在未结束的异步操作中,io_service被提前销毁。
  • n*m n号回调创建了一个新的异步操作,异步操作的完成事件回调是m号回调,<description>标签展示了开始执行的操作。
  • n n号回调正在执行。<description>标签展示了被调用的函数。现目前只有close()和cancel()会被记录,这是因为它们可能会影响异步操作的状态。

<description>标签的形式为<object-type>@<pointer>.<operation>.如果是回调函数的加入,那它会列出参数的名字和值。

如上所展示,每个回调函数都有一个数字id,如果有一个跟踪显示id为0,说明该行为在回调之外执行。

图形展示

调用跟踪可以使用handlerviz.pl工具来图形化表达(需要 GraphViz 工具 dot)。

results matching ""

    No results matching ""