如果要追踪程序的链接库的probe
,可以参考下面这个例子:
bash-3.2# ldd ./exclude
libpthread.so.1 => /lib/libpthread.so.1
libodbc.so.2 => /usr/local/lib/libodbc.so.2
librt.so.1 => /lib/librt.so.1
libc.so.1 => /lib/libc.so.1
libiconv.so.2 => /usr/local/lib/libiconv.so.2
libthread.so.1 => /lib/libthread.so.1
libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1
libaio.so.1 => /lib/libaio.so.1
libmd.so.1 => /lib/libmd.so.1
libm.so.2 => /lib/libm.so.2
bash-3.2# dtrace -n 'pid$target:libodbc.so::entry{}' -c ./exclude | more
dtrace: description 'pid$target:libodbc.so::entry' matched 574 probes
CPU ID FUNCTION:NAME
1 57335 SQLAllocHandle:entry
1 57334 __SQLAllocHandle:entry
1 57546 __validate_env:entry
1 57537 mutex_entry:entry
1 57538 mutex_exit:entry
1 57567 thread_protect:entry
1 57537 mutex_entry:entry
......
可以看到,程序链接了libodbc.so
,以链接库的名字作为module
,就可以了。
但是如果要追踪程序运行时打开链接库的probe
,该如何办呢?比方说,程序运行时使用dlopen
打开了链接库libmyodbc5.so
,假如我们用同样的方式:
bash-3.2# dtrace -n 'pid$target:libmyodbc5.so::entry{}' -c ./exclude
dtrace: invalid probe specifier pid$target:libmyodbc5.so::entry{}: probe description pid22966:libmyodbc5.so::entry does not match any probes
可以看到会报错,因为程序编译时,没有链接到libmyodbc5.so
。
为了可以追踪程序运行时打开链接库的probe
,可以使用“-Z
”选项。这样dtrace
就会忽略错误,直到动态链接库被加载进来,probe
就可以被创建并使用了:
bash-3.2# dtrace -Zn 'pid$target:libmyodbc5.so::entry{}' -c ./exclude | more
dtrace: description 'pid$target:libmyodbc5.so::entry' matched 0 probes
CPU ID FUNCTION:NAME
0 57519 SQLAllocHandle:entry
0 57504 my_SQLAllocEnv:entry
0 57503 myodbc_thread_key_create:entry
0 57473 myodbc_init:entry
0 57523 init_getfunctions:entry