1

以下代码在 MySQL 5.5 storage/example/ha_example.cc 中:

MYSQL_READ_ROW_START(table_share->db.str, table_share->table_name.str, TRUE);
rc= HA_ERR_END_OF_FILE;
MYSQL_READ_ROW_DONE(rc);

我在整个项目中搜索MYSQL_READ_ROW_START定义,在include/probes_mysql_nodtrace.h中找到:

#define MYSQL_READ_ROW_START(arg0, arg1, arg2)
#define MYSQL_READ_ROW_START_ENABLED() (0)
#define MYSQL_READ_ROW_DONE(arg0)
#define MYSQL_READ_ROW_DONE_ENABLED() (0)

这里只是一个空的宏定义。

我的问题是,为什么这个宏 MYSQL_READ_ROW_START 没有与任何函数关联,而是在上面的代码中用作函数?

谢谢。

4

2 回答 2

2

这些不是传统的宏:它们是 DTrace 的探测点,DTrace 是 Solaris、OS X、FreeBSD 和各种其他操作系统的可观察性框架。

DTrace 围绕着这样一种概念,即不同的提供商提供某些探针,人们可以通过这些探针观察正在运行的可执行文件甚至操作系统本身。一些提供者是基于时间的;例如,通过定期触发,探针可以用于分析 CPU 的使用情况。其他提供程序是基于代码的,例如,它们的探测器可能会在函数的入口和出口处触发。

您突出显示的代码是 USDT(用户域静态定义跟踪)提供程序的示例。USDT 提供者的规范用途是在交易中公开有意义的事件。例如,事务的开始和结束很可能发生在不同功能的深处;在这种情况下,最好让开发人员准确地确定他想要揭示的内容和时间。

USDT 探测不仅仅是一个可切换的 printf(),尽管它当然可以用来显示信息,例如一些本地值,例如交易的中间结果。USDT 探针也可用于触发行为。例如,一个人可能只想在某个事务的持续时间内激活一些网络探测器。

回到您的问题,USDT 探测是通过在代码中编写宏来实现的,这些宏与其他地方的“.d”文件中的提供者描述相对应。这由 dtrace(1) 实用程序解析,该实用程序生成一个适合编译的头文件。在缺少 DTrace 的系统上,定义一个将 USDT 宏变为空操作的头文件是有意义的,并且根据给定的文件名 (probes_mysql_nodtrace.h) 判断,这就是您所观察到的。

于 2013-08-09T13:03:36.797 回答
1

请参阅http://dev.mysql.com/tech-resources/articles/getting_started_dtrace_saha.html

去引用:

DTrace 探测器由称为提供程序的内核模块实现,每个提供程序执行一种特定类型的检测来创建探测器。因此,提供者可以描述为 DTrace 消费者可以使用的探针的发布者(见下文)。提供程序可用于检测内核和用户级代码。对于用户级代码,可以通过两种方式定义探针——用户级静态定义跟踪 (USDT) 或 PID 提供程序。

因此,似乎要由 DTrace 提供者来实现这样的宏。

于 2013-08-08T17:26:49.407 回答