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()] ++
}
}