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

これらは従来のマクロではありません。これらは、Solaris、OS X、FreeBSD、およびその他のさまざまなオペレーティング システムの監視フレームワークである DTrace のプローブ ポイントです。

DTrace は、さまざまなプロバイダーが実行中の実行可能ファイルやオペレーティング システム自体を観察できる特定のプローブを提供するという概念に基づいています。一部のプロバイダーは時間ベースです。一定の間隔で起動することにより、プローブは、たとえば、CPU の使用状況をプロファイルするために使用できます。他のプロバイダーはコードベースであり、そのプローブは、たとえば、関数の入り口と出口で起動する場合があります。

強調表示されているコードは、USDT (ユーザーランドの静的に定義されたトレース) プロバイダーの例です。USDT プロバイダーの正規の用途は、トランザクション内で意味のあるイベントを公開することです。たとえば、トランザクションの開始と終了は、さまざまな機能の奥深くで発生する可能性があります。この場合、開発者は何をいつ公開したいかを正確に特定するのが最善です。

USDT プローブは単なる切り替え可能な printf() ではありませんが、もちろんトランザクションの中間結果などのローカル値などの情報を明らかにするために使用できます。USDT プローブを使用して動作をトリガーすることもできます。たとえば、特定のトランザクションの間だけ、いくつかのネットワーク プローブをアクティブにしたい場合があります。

質問に戻りますが、USDT プローブは、別の場所にある「.d」ファイルのプロバイダーの記述に対応するコードにマクロを記述することによって実装されます。これは、コンパイルに適したヘッダー ファイルを生成する dtrace(1) ユーティリティによって解析されます。DTrace がないシステムでは、USDT マクロが null ops になったヘッダー ファイルを定義することは理にかなっています。指定されたファイル名 (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 コンシューマが使用できるプローブのパブリッシャーとして記述できます (以下を参照)。プロバイダーは、カーネルお​​よびユーザーレベルのコードを計測するために使用できます。ユーザー レベルのコードの場合、プローブを定義する方法は 2 つあります。ユーザー レベルの静的に定義されたトレース (USDT) または PID プロバイダーです。

そのため、そのようなマクロを実装するかどうかは DTrace プロバイダーに任されているようです。

于 2013-08-08T17:26:49.407 に答える