ltrace
명령이 어떻게 작동하는지 이해하려고 노력 중입니다 .
그래서 같이 놀고 있었어/etc/nsswitch.conf
. 거기에 "hosts:resolve" 라인이 있습니다.glibc동적 로딩nss-resolve
호스트 이름 조회를 위한 플러그인 모듈입니다. 플러그인이 로드된 것을 보고 싶습니다 ltrace
.
$ ltrace getent hosts google.com
mtrace() = <void>
setlocale(LC_ALL, "") = "en_GB.UTF-8"
textdomain("libc") = "libc"
argp_parse(0x55e7c8bf5140, 3, 0x7fffd79d00c8, 0) = 0
strcmp("hosts", "hosts") = 0
inet_pton(10, 0x7fffd79d11fb, 0x7fffd79cff60, 0) = 0
inet_pton(2, 0x7fffd79d11fb, 0x7fffd79cff60, 38) = 0
gethostbyname2(0x7fffd79d11fb, 10, 0, 55) = 0x7fbb0311b340
inet_ntop(10, 0x55e7c8f3ba38, 0x7fffd79cfef0, 46) = 0x7fffd79cfef0
printf("%-15s %s", "2a00:1450:4009:", "google.com") = 35
__overflow(0x7fbb03118760, 10, 0x7fffd79cf990, 02a00:1450:4009:816::200e google.com) = 10
+++ exited (status 0) +++
플러그인 이 ltrace
로드되는 것처럼 보이는 출력에는 아무것도 없지만 ./lib/x86_64-linux-gnu/libnss_resolve.so.2
strace
예를 들어, 로딩 프로세스에 다음이 포함된다고 99% 확신합니다.전화도착하다__nss_configure_lookup()
glibc/nss/nsswitch.c에서그러나 출력에는 그러한 호출이 없습니다. 왜 그렇습니까? __nss_configure_lookup()
호출되는 사용법이나 다른 도구를 볼 수 있는 방법이 있습니까 ?ltrace
답변1
$ ltrace getent hosts google.com
예를 들어, 로딩 프로세스에는 glibc/nss/nsswitch.c에서 __nss_configure_lookup() 호출이 포함된다고 99% 확신합니다.
왜 그럴까요? -s
플래그[1]을 사용하고 있지 않습니다 :
% ltrace getent -s hosts:dns hosts google.com
...
__nss_configure_lookup(0x563d2eecc194, 0x7ffcff9ec80f, 5, 9) = 0
...
ltrace 출력에는 플러그인이 로드되는 것처럼 보이는 내용이 없습니다.
ltrace
라이브러리 내부의 호출은 추적할 수 없습니다. 이와 같은 디버거를 사용하면 gdb
원하는 위치에 중단점과 감시점을 설정할 수 있습니다.
[1] 귀하가 링크한 출처 인용:
879 static error_t
880 parse_option (int key, char *arg, struct argp_state *state)
881 {
882 char *endp;
883 switch (key)
884 {
885 case 's':
886 endp = strchr (arg, ':');
887 if (endp == NULL)
888 /* No specific database, change them all. */
889 for (int i = 0; databases[i].name != NULL; ++i)
890 __nss_configure_lookup (databases[i].name, arg);
891 else
892 {
893 int i;
894 for (i = 0; databases[i].name != NULL; ++i)
895 if (strncmp (databases[i].name, arg, endp - arg) == 0)
896 {
897 __nss_configure_lookup (databases[i].name, endp + 1);
898 break;
899 }
900 if (databases[i].name == NULL)
901 error (EXIT_FAILURE, 0, gettext ("Unknown database name"));
902 }
903 break;