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
test
590585
등은 (내 추적에서) 호출 에 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-common
printf.c
. 직접 분석해 보면 printf
더 나은 결과를 얻을 수 있습니다 gprof
.