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) = ?
$
感謝を!私はちょうどチェックするために少しperfテストを行いますが、あなたが言ったことはかなり意味があります。再度、感謝します。 – johnnycrash
厄介なプリプロセッサマクロではなく、通常の正常なC関数としてSTRACE_TRACEを書いてください。必要に応じてprintf()スタイルの引数を使用するようにします。 – MarkR