2011-01-07 5 views
3

straceをたくさん使います。 straceにテキストを出力して、コードが到達した場所をマークしたいと考えています。私が人々がこれまで行ってきたのは、存在しないファイルをstatすることです。ファイル名はstraceで見たいテキストにすぎません。かなり速いですが、もっと良い方法があると確信しています。マウントポイントが偽であっても、多くのコードやおそらくカーネルロックがヒットしてしまうかもしれないと心配しています。何か案は?範囲外のファイルディスクリプタへカスタムテキストをstraceに印刷します。 Straceコメント

答えて

6

write()strace出力にも現れ、そしてはるかに高速でなければなりません - 範囲チェックが早期に発生し、それがすべてでデータを見る必要はありません。 (あなたはむしろちょうど0で終了する文字列よりも、書き込むデータの長さを渡す必要がありますが、GCCは、通常、一定の定数文字列のstrlen()を最適化します。)

$ cat hw.c 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

#define STRACE_TRACE(str) write(-1, str, strlen(str)) 

int main(void) 
{ 
    STRACE_TRACE("before"); 
    printf("Hello world\n"); 
    STRACE_TRACE("after"); 
    return 0; 
} 
$ gcc -Wall -o hw hw.c 
$ strace ./hw 
... 
write(-1, "before"..., 6)    = -1 EBADF (Bad file descriptor) 
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 150), ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77da000 
write(1, "Hello world\n"..., 12Hello world 
)  = 12 
write(-1, "after"..., 5)    = -1 EBADF (Bad file descriptor) 
exit_group(0)       = ? 
$ 
+0

感謝を!私はちょうどチェックするために少しperfテストを行いますが、あなたが言ったことはかなり意味があります。再度、感謝します。 – johnnycrash

+0

厄介なプリプロセッサマクロではなく、通常の正常なC関数としてSTRACE_TRACEを書いてください。必要に応じてprintf()スタイルの引数を使用するようにします。 – MarkR

関連する問題