dtrace PID provider vs. libraries loaded by python
As I was doing some work on beadm, I really wanted to know who was mucking with properties on datasets. It looked as though I could do something like:
# dtrace -qn 'pid$target:libzfs.so.1:zfs_prop_set:entry / copyinstr(arg0 + 8) == $1 / { printf("%s(%s,%s,%s)\n", probefunc, copyinstr(arg0 + 8), copyinstr(arg1), copyinstr(arg2)); ustack(); }' -c 'beadm create test' $datasetBut that doesn't work:
... probe description pid12942:libzfs.so.1:zfs_prop_set:entry does not match any probesMy guess is because that this is because the python executable is not linked against libzfs - a very good thing. To get around this, we need to preload libzfs. For example:
# LD_PRELOAD_32=libzfs.so.1 dtrace -qn 'pid$target:libzfs.so.1:zfs_prop_set:entry / copyinstr(arg0 + 8) == $1 / { printf("%s(%s,%s,%s)\n", probefunc, copyinstr(arg0 + 8), copyinstr(arg1), copyinstr(arg2)); ustack(); }' -c 'beadm create test' rpool/zones/z1/rpool/ROOT/zbe-1 zfs_prop_set(rpool/zones/z1/rpool/ROOT/zbe-1,mountpoint,legacy) libzfs.so.1`zfs_prop_set libbe.so.1`be_unmount_zone_root+0xa9 libbe.so.1`be_update_zone_vfstab+0x106 libbe.so.1`be_copy_zones+0x9d9 libbe.so.1`be_copy+0x8f2 libbe_py.so`beCopy+0x245 ...The only change here was the addition of LD_PRELOAD_32=libzfs.so.1 at the beginning of the command. LD_PRELOAD would have worked as well, but it wouldn't work if a different library that does not have a 64-bit variant was being traced. That is because dtrace would fail to start because the 64-bit library was not able to be found. I found this when I needed to poke around at calls within libbe.so.1, which is 32-bit only.
2 comments:
Thanks this was helpful.
Actually there's better way to this now. Using dtrace -Z will preload all the libraries required.
Post a Comment