printf 객체/모듈 찾기

printf 객체/모듈 찾기

printf내 C 코드에서 실행될 때 어떤 커널 모듈이 호출되는지 알고 싶습니다 . 어떻게 찾을 수 있나요? . ldd​나는 비슷한 것을 찾고 있습니다. 기본적으로 배우고 싶습니다.파일 구조printf를 담당합니다.

다음 코드를 고려해보세요

#include <stdio.h>
int main()
{
  int i = 0;
  int N = 100;
  while (i++ <= N) {
    printf("%d ", i);
  }
  return 0;
}

perf 명령을 실행하면 perf record -e cycles -j any -a -o perf.data ./test데이터 파일에 다음 출력이 표시됩니다.

# Overhead  Command  Source Shared Object  Source Symbol                           Target Symbol                           Basic Blo
# ........  .......  ....................  ......................................  ......................................  .........
#
    21.19%  swapper  [unknown]             [k] 0000000000000000                    [k] 0000000000000000                    -
    10.98%  swapper  [kernel.vmlinux]      [k] __intel_pmu_enable_all              [k] native_write_msr                    -
    10.66%  swapper  [kernel.vmlinux]      [k] intel_pmu_lbr_enable_all            [k] __intel_pmu_enable_all              -
    10.66%  swapper  [kernel.vmlinux]      [k] native_write_msr                    [k] intel_pmu_lbr_enable_all            -
     5.00%  perf     [kernel.vmlinux]      [k] smp_call_function_single            [k] smp_call_function_single            -
     3.14%  swapper  [kernel.vmlinux]      [k] acpi_os_read_memory                 [k] acpi_os_read_memory                 -
     2.23%  swapper  [kernel.vmlinux]      [k] intel_idle                          [k] intel_idle                          -
     1.88%  swapper  [kernel.vmlinux]      [k] sched_clock                         [k] native_sched_clock                  -
     1.82%  swapper  [kernel.vmlinux]      [k] native_sched_clock                  [k] sched_clock                         -
     1.15%  swapper  [kernel.vmlinux]      [k] nmi_handle                          [k] sched_clock                         -
     1.15%  swapper  [kernel.vmlinux]      [k] native_set_fixmap                   [k] native_set_fixmap                   -
     1.09%  swapper  [kernel.vmlinux]      [k] sched_clock                         [k] nmi_handle                          -
     0.82%  swapper  [kernel.vmlinux]      [k] __x86_indirect_thunk_rax            [k] __x86_indirect_thunk_rax            -
  ...
  ...

그렇다면 모듈/파일 및 연결은 어디에 있습니까 printf? 성능 출력의 첫 번째 줄은 무엇을 의미합니까?

printf화면에 무언가를 표시하기 위해 실행되는 코드를 분석하고 싶다고 가정해 보겠습니다 .

고쳐 쓰다:

다음 출력은 내가 원하는 옵션을 사용하여 소스에서 다시 컴파일한 사용자 정의 glibc 버전에 대해 내 테스트 프로그램이 연결되어 있음을 보여줍니다.

$ ldd test
        linux-vdso.so.1 =>  (0x00007ffe26875000)
        libc.so.6 => /opt/glibc-2.23-install/libc.so.6 (0x00007f28196d5000)
        /opt/glibc-2.23-install/lib/ld-2.23.so => /lib64/ld-linux-x86-64.so.2 (0x00007f2819a76000)

답변1

보고 있는 이벤트는 test프로그램에서 가져온 것이 아닙니다. "명령" 필드에서 줄을 찾아 test확대해야 합니다. 운이 좋으면( perf record샘플 때문에 ) 다음과 같은 항목을 볼 수 있습니다.

   1.31%  590585  libc-2.30.so       [.] __vfprintf_internal                         [.] __vfprintf_internal
   0.18%  590585  libc-2.30.so       [.] _itoa_word                                  [.] _itoa_word
   0.18%  590585  libc-2.30.so       [.] __vfprintf_internal                         [.] _IO_file_xsputn@@GLIBC_2.2.5
   0.18%  590585  libc-2.30.so       [.] _IO_file_xsputn@@GLIBC_2.2.5                [.] __vfprintf_internal
   0.18%  590585  libc-2.30.so       [.] __strchrnul_avx2                            [.] __strchrnul_avx2

test590585등은 (내 추적에서) 호출 에 printf해당 하는 C 라이브러리로 의 호출을 보여줍니다 .

printf주로 C 라이브러리에서 구현되므로 커널에서 많은 종속성을 찾을 수 없습니다. 프로그램을 실행하면 strace다음과 유사한 결과가 나타납니다.

...
write(1, "1 2 3 4 5 6 7 8 9 10 11 12 13 14"..., 2961 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 ) = 296
exit_group(0)                           = ?
+++ exited with 0 +++

프로그램에서 유일한 출력 관련 시스템 호출은 단일 호출입니다 write. C 라이브러리는 출력을 버퍼링하므로 모든 호출이 printf버퍼에 추가되고 프로그램이 종료되면 버퍼가 단일 호출로 플러시됩니다.

GNU C 라이브러리에서 어떻게 구현되는지 보려면 다음의 printf소스 코드를 살펴보세요.stdio-commonprintf.c. 직접 분석해 보면 printf더 나은 결과를 얻을 수 있습니다 gprof.

관련 정보