Solaris 动态跟踪指南

第 30 章 pid 提供器

使用 pid 提供器,可跟踪用户进程中函数的进入和返回,以及按绝对地址或函数偏移量指定的任何指令。不启用探测器时,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 探测器。entry 探测器的参数为被跟踪函数的参数的值。

return 探测器

被跟踪函数返回或对另一个函数进行尾部调用时,将触发 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

参数 

专用 

专用 

未知