2011-01-07 2 views
3

Мы используем strace много. Мы хотим вывести некоторый текст в strace, чтобы отметить места, которые достиг код. То, как я вижу, что люди сделали это до сих пор, - это ставить несуществующий файл. Имя файла - это просто текст, который они хотят видеть в strace. Это довольно быстро, но я уверен, что есть лучший способ. Я беспокоюсь, что может быть много кода, и, возможно, блокировки ядра будут удалены, хотя точка монтирования является фиктивной. Есть идеи?Печать пользовательского текста в strace. Strace comments

ответ

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

Спасибо! Я сделаю небольшой перфекционный тест, чтобы проверить, но то, что вы сказали, имеет большой смысл. Еще раз спасибо. – johnnycrash

+0

Да, или напишите STRACE_TRACE как обычную, нормальную функцию C вместо неприятного макроса препроцессора. Используйте, если хотите, аргументы стиля printf(). – MarkR

Смежные вопросы