라이브러리 함수 호출에 대한 시스템 전반의 모니터링

라이브러리 함수 호출에 대한 시스템 전반의 모니터링

나는 많은 프로세스가 동시에 실행되는 최신 Linux 데스크탑을 가지고 있습니다. 프로세스 중 하나(어떤 프로세스인지는 모르겠습니다)가 some_func인기 있는 동적 라이브러리 some_lib( libc또는 libx11이라고 생각하세요)의 함수를 호출합니다.많은이를 사용하는 프로세스) 어떤 프로세스가 이 작업을 수행하는지 알고 싶습니다(이상적으로는 각 호출에 대한 스택 추적이 있어야 함).

어떤 프로세스가 호출되었는지 확인하는 방법은 무엇입니까 some_lib?

지금까지 고려한 옵션은 다음과 같습니다.

  1. ltrace또는 사용 latrace: ltrace호출하려는 함수와 어떤 인수가 완벽할지에 대한 자세한 프로세스 목록이 있지만 ltrace단일 프로세스 또는 프로세스 그룹에만 해당됩니다. 그냥 입력 ltrace -e some_func@some_lib -fp 1하고 시스템 전체에서 모든 사용을 볼 수는 없습니다 .
  2. 내 라이브러리를 사용하는 프로세스를 찾아 lsof1단계로 진행합니다. 동일한 라이브러리를 사용하지만 해당 함수를 호출하지 않는 프로세스가 너무 많기 때문에 이는 매우 번거로운 작업입니다.
  3. grep -r some_func /usr그런 다음 소수의 바이너리만 함수를 호출하고 거기에서 작업할 수 있는지 확인합니다. 비록할 수 있다일부 제한된 경우에는 작동하지만 이는 결코 일반적인 솔루션이 아니며 some_func예를 들어 다양한 바이너리에 편재되어 있지만 거의 호출되지 않는 경우 작동하지 않습니다.
  4. 커널 감사 시스템을 사용하십시오. 시스템 호출을 추적하는 경우 입력할 수 auditctl -S some_syscall ...있으며 이는 시스템 전체 호출을 기록하는 역할을 합니다. 하지만, auditctl그걸로 하는 것은 불가능해 보인다.라이브러리 기능.
  5. 드디어 할 수 있어재건라이브러리에서 관심 있는 함수에 새 줄을 추가하면 모든 호출이 기록됩니다. 이것이 내 문제를 해결하는 것은 보장되지만 이 솔루션은 번거롭고 라이브러리를 수정/다시 컴파일해야 하며 감지 라이브러리를 롤아웃하고 범인이 발견되면 롤백하기 위해 최소한 두 번 재부팅해야 합니다.

더 쉬운 방법이 있나요?

(이것은 일반적인 질문이라는 점을 지적하고 싶습니다. 가능한 일반적인 해결책에 가장 관심이 있습니다.)


좋은 걸 찾았어요비교 기사내가 알지 못했던 일부 추적 시설에 대해 언급했는데, 이는 탐색해 볼 가치가 있을 수 있습니다.

답변1

debuginfo가 포함된 SystemTap은 Centos 7 시스템의 라이브러리에서 함수 호출을 추적할 수 있습니다.

$ sudo stap -L 'process("/lib64/libglib*").function("*strndup*")'
process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup")
$ 

probe이는 인쇄 역추적이나 SystemTap으로 작성할 수 있는 원하는 지점 으로 사용할 수 있습니다 .

probe begin {
    printf("ok\n")
}
probe process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup") {
    /* printf("%s[%d]\n", execname(), pid()) */
    print_usyms(ubacktrace())
}

다른 이름으로 저장하면 probelibraryfunc.stp다음을 통해 실행할 수 있습니다.

$ sudo stap probelibraryfunc.stp

호출이 일반적인 경우에는 많은 출력이 발생할 수 있지만 ...

관련 정보