2014-12-10 6 views
1

Я хотел форматировать выходные данные, полученные с помощью Strace опции «Strace -s 1024 -vftT» и имеет что-то вроде журнала,Трассирование выход: время меры, принимаемые для системного вызова

... <log that is un-important> 
24339 01:51:55 sendto(4, "<logging to required file>", <size>, MSG_NOSIGNAL, NULL, 0) = 114 <0.000050> 
... 
15016 01:51:55 sendto(594, "<some log to different file>, not included for time measure", <size>, 0, NULL, 0 <unfinished ...> 
... <log from different threads> 
15016 01:51:55 <... sendto resumed>) = 5 <0.000076> 
... <log that is un-important> 
29192 01:51:57 sendto(4, "<logging to required file>", <size>, MSG_NOSIGNAL, NULL, 0 <unfinished ...> 
... 
29192 01:51:58 <... sendto resumed>) = 109 <0.652744> 
... <log that is un-important> 

-> Я хотел найти общее время, затраченное на все вызовы sendto (4). -> Это также должно учитывать возобновленные вызовы sendto() после переключения потоков. -> Расчет времени должен игнорировать вызовы sendto() для другого файлового дескриптора, отличного от файлового дескриптора 4.

Так что мне нужно в этом случае мне нужен какой-то скрипт (желательно с помощью sed), чтобы добавить все тайминги, сделанные sendto (4, ...) (в этом примере это 0,000050 + 0,652744 = 0,652794).

Любые ссылки на подобные контексты приветствуются (я пробовал найти, но не смог найти что-либо релевантное).

+2

HTTP: // WWW .grymoire.com/Unix/Awk.html может делать все, что вам нужно. Извините, но переполнение стека не является бесплатным кодированием. Удачи. – shellter

+0

не стесняйтесь обновлять свой вопрос с помощью требуемого вывода (на основе введенного выше примера) (и в нужном формате), а также любые попытки решить вашу проблему. Включите текущие выходные сообщения и сообщения об ошибках. 'sed' может делать много вещей, но добавление, грандиозные итоги будут супер-гениальным пользователем. Awk предназначен для этого. Подсказка: 'awk '/ text 2 match/{timeval = $ (NF); gsub (/ [<> /," ", timeval); totTime + = timeval} END {print "totalTime =" totTime} '/ path/to/log/file'. Удачи. – shellter

+0

Спасибо @Shellter, Ниже приведен пример вывода с обновленным скриптом ... '24339 01:51:55 sendto (4,« », , MSG_NOSIGNAL, NULL, 0) = 114 <0.000050> . .. 29192 01:51:57 sendto (4, "", , MSG_NOSIGNAL, NULL, 0 <недостроенный ...> ... 29192 01:51:58 <... sendto resumed>) = 109 <0.652744> всего = 0.652794, cnt = 2, average = 0.326397' –

ответ

1

Вслед работал для меня, благодаря Shellter для предложения использовать AWK (хотя я не рассматривал специальные случаи, когда «SendTo» сам по себе является частью данных для других системных вызовов)

cat strace.txt | awk ' 
function find_thread(maxInd, threads, threadStrArr, reqThr) 
{ 
    for (ind = 1; ind <= maxInd; ind++) 
    { 
     if (reqThr == threads[ind]) 
     { 
      printf "...\n%s\n...\n", threadStrArr[ind] 
      for (; ind < maxInd; ind++) 
      { 
       threads[ind] = threads[ind + 1] 
       threadStrArr[ind]=threadStrArr[ind + 1] 
      } 
      return reqThr 
     } 
    } 
    return -1 
} 
{ 
    thrCnt=0 
    totmatchCnt=0 
    totTimetaken=0 
    syscall_name="sendto" 
    while ((getline myline) > 0) { 
     found_syscall_finished=0 
     resumed_found=match(myline, "<... "syscall_name" resumed>") 
     if (resumed_found != 0) 
     { 
      # Found "<system call> resumed" string in the input line 
      split(myline,a," "); 
      thread_id=a[1] 
      if (thrCnt > 0) 
      { 
       # Now need to find matching thread (if any) from the unfinished calls 
       foundThr=find_thread(thrCnt, threads, threadStrArr, thread_id) 
       if (foundThr != -1) 
       { 
        # There is a matching unfinished call found in the trace 
        thrCnt-- 
        found_syscall_finished=1 
       } 
      } 
     } 
     else 
     { 
      # It is not resumed system call, check if required system call found 
      syscall_found = match(myline, syscall_name"\\(4,") # Please note the 4, ie first parameter is 4 
      if (syscall_found != 0) 
      { 
       # It is required system call 
       unfinished_found=match(myline, "<unfinished ...>$") 
       if (unfinished_found != 0) 
       { 
        # It is an unfinished call, add thread number to the array for search later 
        split(myline,a," "); 
        thrCnt++ 
        threadStrArr[thrCnt]=myline 
        threads[thrCnt]=a[1] 
       } 
       else 
       { 
        found_syscall_finished=1 
       } 
      } 
     } 
     if (found_syscall_finished != 0) 
     { 
      # current line contains required system call which is finished, fetch time and add to total time 
      printf "%s\n", myline 
      n=split(myline,a,"[ <>]"); 
      time_took=a[n-1] 
      totmatchCnt++ 
      totTimetaken=totTimetaken+time_took 
     } 
    } 
    if (totmatchCnt != 0) 
    { 
     avgTime=totTimetaken/totmatchCnt 
     printf "total = %s, cnt = %s, average = %s\n", totTimetaken, totmatchCnt, avgTime 
    } 
} 
' 

sample output, 
------------------------------------------------------------------------------------------- 
24339 01:51:55 sendto(4, "<logging to required file>", <size>, MSG_NOSIGNAL, NULL, 0) = 114 <0.000050> 
... 
29192 01:51:57 sendto(4, "<logging to required file>", <size>, MSG_NOSIGNAL, NULL, 0 <unfinished ...> 
... 
29192 01:51:58 <... sendto resumed>) = 109 <0.652744> 
total = 0.652794, cnt = 2, average = 0.326397 

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

  • Нет связанных вопросов^_^