systemtap은 프로세스의 모든 커널 기능을 인쇄합니다.

systemtap은 프로세스의 모든 커널 기능을 인쇄합니다.

a.out프로세스가 커널 모드로 들어갈 때 프로세스와 관련된 모든 커널 기능을 어떻게 인쇄할 수 있습니까? IE, 특정 pid/execname에 대한 커널 함수를 필터링하고 싶습니다. 다음은 커널 모드에서 실행되는 프로세스와 stap관련된 커널 기능을 추적하기 위해 만든 스크립트입니다. 이것은 나에게는 결코 효과가 없습니다. mm추적하려는 기호의 양 때문인 것 같습니다 .stap

root@test:~/systemtap# cat test9.stp
#! /usr/bin/env stap

global traces

probe kernel.function("*@mm/*.c") {
  traces[pid(), pexecname(), backtrace()] ++
}
probe end {
  foreach ([pid, name, stack] in traces-) {
    printf ("traces[%d,%s,\n", pid, name)
    print_stack (stack)
    printf ("] = %d\n", traces[pid, name, stack]);
  }
}
root@test:~/systemtap# stap test9.stp
WARNING: probe kernel.function("is_errata93@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:417") (address 0xffffffffb329ebd4) registration error [man warning::pass5] (rc -22)
WARNING: probe kernel.function("do_sigbus@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:934") (address 0xffffffffb329ef28) registration error [man warning::pass5] (rc -22)
WARNING: probe kernel.function("spurious_kernel_fault@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:1007") (address 0xffffffffb329ef40) registration error [man warning::pass5] (rc -22)
WARNING: probe kernel.function("exc_page_fault@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:1497") (address 0xffffffffb3f9e780) registration error [man warning::pass5] (rc -22)
WARNING: probe kernel.function("do_user_addr_fault@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:1220") (address 0xffffffffb329e8d0) registration error [man warning::pass5] (rc -22)
WARNING: probe kernel.function("do_kern_addr_fault@/build/linux-pm2SeW/linux-5.15.0/arch/x86/mm/fault.c:1147") (address 0xffffffffb329f170) registration error [man warning::pass5] (rc -22)
WARNING: Missing unwind data for a module, rerun with 'stap -d kernel'
WARNING: too many pending (warning) messages
ERROR: too many pending (error) messages
WARNING: Number of errors: 1, skipped probes: 1891693
WARNING: /usr/bin/staprun exited with status: 1
Pass 5: run failed.  [man error::pass5]
Number of similar warning messages suppressed: 38.
Rerun with -v to see them.

답변1

systemtap다음과 같은 징후가 있습니다.

   -x PID Sets target() to PID. This allows scripts to  be  written  that  filter  on  a  specific
          process. Scripts run independent of the PID's lifespan.

플래그를 사용하여 스크립트를 실행하는 경우 스크립트 내에서 이를 호출하면 제공한 pid가 반환됩니다 -x <pid>.target()

stap test9.stp -x <pid>

그런 다음 다음과 같이 스크립트에서 사용할 수 있습니다.

probe kernel.function("*@mm/*.c") {
  if (pid() == target()) {
    traces[pid(), pexecname(), backtrace()] ++
  }
}

관련 정보