如何用DTrace持续追踪频繁重启进程中指定库的函数调用?
解决进程重启后持续追踪指定库函数调用的问题
你遇到的核心问题是用了oneshot模式——它是绑定单个PID的一次性追踪逻辑,自然没法适配进程重启的场景。要实现持续追踪名为foo的进程中指定库的所有函数调用,只需要放弃oneshot,改用**进程名过滤+全局用户空间探针(uprobe)**的方式即可,不管进程重启多少次,新实例只要符合条件就会被自动追踪。
具体实现方案
用bpftrace实现(推荐)
bpftrace的语法更直观,直接通过过滤条件锁定目标进程,命令示例如下:
# 追踪名为foo的进程中,指定库的所有函数调用 bpftrace -e 'uprobe:/full/path/to/your/library.so:* /comm == "foo"/ { printf("Called function: %s\n", probefunc); }'
如果不知道库的完整路径,可以用ldd foo查看目标进程的依赖库路径;如果是系统标准库(比如libc),也可以直接写带版本号的库名:
# 示例:追踪foo进程中libc的所有函数调用 bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:* /comm == "foo"/ { printf("Libc function called: %s\n", probefunc); }'
如果需要匹配完整的可执行文件路径而非短命令名,把comm换成exe即可:
bpftrace -e 'uprobe:/full/path/to/your/library.so:* /exe == "/usr/bin/foo"/ { printf("Called function: %s\n", probefunc); }'
用BCC的trace.py实现
如果你习惯用BCC工具链,也可以用trace.py,命令更简洁:
# -U 指定用户空间探针,-n 指定进程名 trace.py -U 'your_library.so:*' -n foo
关键原理说明
uprobe是全局的用户空间探针,会监听系统中所有加载了目标库的进程- 过滤条件(
/comm == "foo"/或-n foo)会只保留目标进程的调用事件 - 当
foo进程重启后,新实例加载目标库时,探针会自动附加到新进程的库函数上,无需手动重启追踪命令
注意事项
- 确保库的路径/名称正确:有些库会有多个版本,用完整路径能避免匹配错误
- 如果只需要追踪特定函数,把
*换成具体的函数名即可(比如your_library.so:target_func) - 部分系统可能需要root权限才能运行这些追踪命令,记得加上
sudo
内容的提问来源于stack exchange,提问作者bnovc
相关产品推荐
相关产品推荐

