나는 많은 프로세스가 동시에 실행되는 최신 Linux 데스크탑을 가지고 있습니다. 프로세스 중 하나(어떤 프로세스인지는 모르겠습니다)가 some_func
인기 있는 동적 라이브러리 some_lib
( libc
또는 libx11
이라고 생각하세요)의 함수를 호출합니다.많은이를 사용하는 프로세스) 어떤 프로세스가 이 작업을 수행하는지 알고 싶습니다(이상적으로는 각 호출에 대한 스택 추적이 있어야 함).
어떤 프로세스가 호출되었는지 확인하는 방법은 무엇입니까 some_lib
?
지금까지 고려한 옵션은 다음과 같습니다.
ltrace
또는 사용latrace
:ltrace
호출하려는 함수와 어떤 인수가 완벽할지에 대한 자세한 프로세스 목록이 있지만ltrace
단일 프로세스 또는 프로세스 그룹에만 해당됩니다. 그냥 입력ltrace -e some_func@some_lib -fp 1
하고 시스템 전체에서 모든 사용을 볼 수는 없습니다 .- 내 라이브러리를 사용하는 프로세스를 찾아
lsof
1단계로 진행합니다. 동일한 라이브러리를 사용하지만 해당 함수를 호출하지 않는 프로세스가 너무 많기 때문에 이는 매우 번거로운 작업입니다. grep -r some_func /usr
그런 다음 소수의 바이너리만 함수를 호출하고 거기에서 작업할 수 있는지 확인합니다. 비록할 수 있다일부 제한된 경우에는 작동하지만 이는 결코 일반적인 솔루션이 아니며some_func
예를 들어 다양한 바이너리에 편재되어 있지만 거의 호출되지 않는 경우 작동하지 않습니다.- 커널 감사 시스템을 사용하십시오. 시스템 호출을 추적하는 경우 입력할 수
auditctl -S some_syscall ...
있으며 이는 시스템 전체 호출을 기록하는 역할을 합니다. 하지만,auditctl
그걸로 하는 것은 불가능해 보인다.라이브러리 기능. - 드디어 할 수 있어재건라이브러리에서 관심 있는 함수에 새 줄을 추가하면 모든 호출이 기록됩니다. 이것이 내 문제를 해결하는 것은 보장되지만 이 솔루션은 번거롭고 라이브러리를 수정/다시 컴파일해야 하며 감지 라이브러리를 롤아웃하고 범인이 발견되면 롤백하기 위해 최소한 두 번 재부팅해야 합니다.
더 쉬운 방법이 있나요?
(이것은 일반적인 질문이라는 점을 지적하고 싶습니다. 가능한 일반적인 해결책에 가장 관심이 있습니다.)
좋은 걸 찾았어요비교 기사내가 알지 못했던 일부 추적 시설에 대해 언급했는데, 이는 탐색해 볼 가치가 있을 수 있습니다.
답변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
호출이 일반적인 경우에는 많은 출력이 발생할 수 있지만 ...