使用 pid 提供器,可跟踪用户进程中函数的进入和返回,以及按绝对地址或函数偏移量指定的任何指令。不启用探测器时,pid 提供器不会产生探测影响。启用探测器后,探测器将仅对其跟踪的那些进程产生探测影响。
当编译器内嵌函数时,pid 提供器的探测器将不触发。要避免在编译时内嵌函数,请查阅编译器的文档。
pid 提供器在探测使用函数指针调用子函数的函数时,其行为不可预测。可将探测器显式放置在函数的入口和返回地址,以分析此类函数。
实际上,pid 定义了一个提供器类。每个进程都可能具有独立关联的 pid 提供器。例如,ID 为 123 的进程将使用 pid123 提供器进行跟踪。对于来自这些提供器的其中之一的探测器,探测器说明的模块部分将引用对应进程的地址空间中装入的对象。以下示例使用 mdb(1) 显示对象列表:
$ mdb -p 1234 Loading modules: [ ld.so.1 libc.so.1 ] > ::objects BASE LIMIT SIZE NAME 10000 34000 24000 /usr/bin/csh ff3c0000 ff3e8000 28000 /lib/ld.so.1 ff350000 ff37a000 2a000 /lib/libcurses.so.1 ff200000 ff2be000 be000 /lib/libc.so.1 ff3a0000 ff3a2000 2000 /lib/libdl.so.1 ff320000 ff324000 4000 /platform/sun4u/lib/libc_psr.so.1 |
在探测器说明中,将根据文件名而不是其完整路径名来命名对象。此外,也可以省略 .1 或 so.1 后缀。以下所有示例命名的探测器都相同:
pid123:libc.so.1:strcpy:entry pid123:libc.so:strcpy:entry pid123:libc:strcpy:entry
第一个示例是探测器的实际名称。其他示例则是为方便而使用的别名,在内部,该别名将被替换为完整的装入对象名称。
对于可执行文件的装入对象,可以使用别名 a.out。以下两种探测器描述指定了同一探测器:
pid123:csh:main:return pid123:a.out:main:return
与所有固定 DTrace 探测器一样,探测器描述的函数字段指定模块字段中的函数。用户应用程序二进制文件的同一个函数可能有多个名称。例如,mutex_lock 可能为 libc.so.1 中函数 pthread_mutex_lock 的备选名称。DTrace 为这样的函数选择一个标准名称,并在内部使用该名称。以下示例说明了 DTrace 在内部如何将模块和函数名称重新映射为标准形式:
# dtrace -q -n pid101267:libc:mutex_lock:entry'{ \ printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename); }' pid101267:libc.so.1:pthread_mutex_lock:entry ^C |
这种自动重命名意味着,您启用的探测器名称可能与实际启用的探测器名称略有不同。在运行同一个 Solaris 发行版的系统上,每次运行 Dtrace 时,标准名称总是保持一致。
有关如何有效使用 pid 提供器的示例,请参见第 33 章。
使用 pid 提供器,可以对用户程序中函数的进入和返回进行跟踪,就像 FBT 提供器为内核提供该功能一样。为适应用户进程,可对本手册中使用 FBT 提供器跟踪内核函数调用的大多数示例略作修改。
调用被跟踪函数时将触发 entry 探测器。entry 探测器的参数为被跟踪函数的参数的值。
被跟踪函数返回或对另一个函数进行尾部调用时,将触发 return 探测器。arg0 的值是函数中返回指令的偏移;arg1 存储返回值。
使用 argN 会将原始的未经过滤的值返回为类型 int64_t。pid 提供器不支持 args[N ] 格式。
使用 pid 提供器,可以跟踪函数中的任何指令。例如,要跟踪函数 main() 4 个字节处的指令,可以使用与以下示例类似的命令:
pid123:a.out:main:4
每次程序执行地址 main+4 处的指令时,将激活此探测器。未定义偏移探测器参数。uregs[] 数组可帮助您检查这些探测器位置的进程状态。有关更多信息,请参见uregs[] 数组。
pid 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参见第 39 章。
元素 |
名称稳定性 |
数据稳定性 |
相关性类 |
---|---|---|---|
提供器 |
发展中 |
发展中 |
ISA |
模块 |
专用 |
专用 |
未知 |
功能 |
专用 |
专用 |
未知 |
名称 |
发展中 |
发展中 |
ISA |
参数 |
专用 |
专用 |
未知 |