런타임에 호출되는 함수를 인쇄하는 도구?

런타임에 호출되는 함수를 인쇄하는 도구?

저는 Unix/Linux 플랫폼에서 다음 작업을 수행할 수 있는 도구를 찾고 있습니다.

  1. 소스 파일이 있고 애플리케이션을 직접 컴파일했습니다(소스 코드는 C로 되어 있지만 그게 중요하지 않다고 생각합니다).
  2. 모든 함수 호출을 stdout/file에 인쇄/로깅하여 이 애플리케이션을 실행하고 싶습니다.

예를 들어:

#include <stdio.h>
int square(int x) { return x*x; }
int main(void) {
    square(2);
}

이 프로그램을 실행하면 인쇄됩니다.

  • 기본
  • 정사각형

나는 gdb이것이 어느 정도 이루어질 수 있다는 것을 이해합니다. valgrind그렇지 않으면 그들 중 누구도 내가 원하는 것을 제대로 수행하지 못합니다. 그런 도구가 존재하는지 궁금합니다. 감사해요.

답변1

실행 파일이 호출될 때 함수 이름을 인쇄하도록 하려면 GNU 시스템에서 gcc' -finstrument-functions옵션을 사용하고 dladdr()주소를 함수 이름으로 변환할 수 있습니다.

좋아요 만들기 instrument.c:

#define _GNU_SOURCE
#include <dlfcn.h>

#include <stdlib.h>
#include <stdio.h>

#define TRACE_FD 3

void __cyg_profile_func_enter (void *, void *)
   __attribute__((no_instrument_function));

void __cyg_profile_func_enter (void *func,  void *caller)
{
  static FILE* trace = NULL;
  Dl_info info;

  if (trace == NULL) {
    trace = fdopen(TRACE_FD, "w");
    if (trace == NULL) abort();
    setbuf(trace, NULL);
  }
  if (dladdr(func, &info))
    fprintf (trace, "%p [%s] %s\n",
             func,
             info.dli_fname ? info.dli_fname : "?",
             info.dli_sname ? info.dli_sname : "?");
}

그런 다음 실행 파일은 다음과 같이 컴파일됩니다.

$ gcc -O0 -rdynamic -finstrument-functions square.c instrument.c -ldl
$ ./a.out 3>&1
0x400a8f [./a.out] main
0x400a4f [./a.out] square

(여기서는 fd 3을 사용하여 함수 이름을 덤프하여 stdout 및 stderr 스트림과 별도로 유지합니다).

dli_sname함수 이름만 필요한 경우 인쇄용으로만 코드를 조정할 수 있습니다.

답변2

사용 gcov:

$ gcc -O0 --coverage square.c
$ ./a.out
$ gcov -i square.c
$ awk -F '[,:]' '$1 == "function" && $3 > 0 {print $3, $4}' square.c.gcov
1 square
1 main

(여기서 숫자는 함수가 호출된 횟수입니다( $3 > 0이 섹션에서는 한 번도 호출되지 않은 함수는 건너뜁니다 awk).

이는 일반적으로 코드 적용 범위(테스트되는 코드의 양)에 사용됩니다. 코드 분석 도구를 사용할 수도 있습니다 gprof(다양한 코드 영역에서 소요되는 시간을 계산하는 데 자주 사용됨).

$ gcc -O0 -pg square.c
$ ./a.out
$ gprof -b -P
            Call graph


granularity: each sample hit covers 2 byte(s) no time propagated

index % time    self  children    called     name
        0.00    0.00       1/1           main [7]
[1]      0.0    0.00    0.00       1         square [1]
-----------------------------------------------

Index by function name

   [1] square

관련 정보