LINUX.ORG.RU

strace не ловит вызовы gettimeofday, clock_gettime

 ,


1

1

Сабж. Пример кода:

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <inttypes.h>

inline uint64_t gettime1(void)
{
  struct timespec tm;
  clock_gettime(CLOCK_REALTIME, &tm);
  return (uint64_t)tm.tv_sec * 1000000000ull + tm.tv_nsec;
}

inline uint64_t gettime2(void)
{
  struct timeval tm;
  gettimeofday(&tm, NULL);
  return (tm.tv_sec * 1000000 + tm.tv_usec) * 1000ULL;
}

int main(void)
{
  uint64_t b = gettime2();
  uint64_t a = gettime1();
  printf("%"PRIu64"\n""%"PRIu64"\n", a, b);
  return 0;
}
Система Linux user-MS-7519 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Выхлоп strace

strace -c ./a.out 
1433046804438570051
1433046804438568000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 28.99    0.000040           5         8           mmap
 17.39    0.000024           6         4           mprotect
 13.04    0.000018           6         3         3 access
 10.87    0.000015           8         2           write
  7.97    0.000011           6         2           open
  7.97    0.000011          11         1           munmap
  5.80    0.000008           3         3           fstat
  2.90    0.000004           2         2           close
  2.17    0.000003           3         1           read
  1.45    0.000002           2         1           arch_prctl
  0.72    0.000001           1         1           brk
  0.72    0.000001           1         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.000138                    29         3 total

В чем может быть проблема?

★★★★★

Смотри реализацию этих функций в libc. Они не обязаны приводить к сисколлам.

Deleted
()
Ответ на: комментарий от Deleted

А если делать сисколл через ассемблерную вставку или через вызов syscall(SYS_clock_gettime,...) это будет более отзывчиво, чем метод, которым ипользуется в libc?

SZT ★★★★★
() автор топика
Ответ на: комментарий от Deleted

И да, желательно еще чтобы задержка между вызовом и получением времени была как можно более постоянная.

SZT ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

А какую конкретно область памяти оно читает на x86-64 если делать clock_gettime(CLOCK_REALTIME, &tm)? Если через GDB залезть в вызов этого clock_gettime то там достаточно много кода.

SZT ★★★★★
() автор топика
Ответ на: комментарий от post-factum

+1 это оптимальное решение

anonymous
()

man strace почитай

Смотри, что там есть:

-f Trace child processes as they are created by currently traced processes as a result of the fork(2) system call.

И т.д.

P.s. твой код не компиляет.

# g++ gettime_example.cpp gettime_example.cpp: In function ‘uint64_t gettime2()’: gettime_example.cpp:16:18: error: aggregate ‘gettime2()::timeval tm’ has incomplete type and cannot be defined gettime_example.cpp:17:25: error: ‘gettimeofday’ was not declared in this scope

# gcc gettime_example.c gettime_example.c: In function ‘gettime2’: gettime_example.c:16:18: error: storage size of ‘tm’ isn’t known

Можэ флаги какие нужны? Почему не выкладываешь Makefile?

# uname -a Linux kali 3.18.0-kali1-amd64 #1 SMP Debian 3.18.3-1~kali4 (2015-01-22) x86_64 GNU/Linux

anonymous
()
Ответ на: комментарий от anonymous

Нормально оно компилируется без всяких флагов, через gcc filename.c или g++ filename.c

Никаких дополнительных опций я не передавал

uname -a
Linux user-MS-7519 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

SZT ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.