You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:32:11