systemtap:如何确定探测事件和参数
systemtap: how to determine probe events and args
我正在尝试找出这些写入我的闪存驱动器的原因。
deathstar> while true
> do
> dmesg|grep sdc|grep WRITE
> sleep 3
> done
[17967.580179] kworker/u4:2(6863): WRITE block 20971648 on sdc1 (8 sectors)
[17967.580206] kworker/u4:2(6863): WRITE block 20971784 on sdc1 (8 sectors)
[17967.580214] kworker/u4:2(6863): WRITE block 20971832 on sdc1 (8 sectors)
[17967.580222] kworker/u4:2(6863): WRITE block 21037080 on sdc1 (8 sectors)
我运行:
perf record -g -a
然后
perf report -s comm
得到
- 0.10% 0.10% kworker/u4:2 ▒
ext4_bio_write_page ▒
strnlen ▒
elv_rqhash_del.isra.5.part.6 ▒
find_get_pages ▒
find_get_pages_tag ▒
scsi_init_io ◆
ext4_mb_use_inode_pa ▒
cpuacct_charge ▒
i915_gem_retire_requests_ring ▒
cfq_insert_request ▒
i915_gem_free_request ▒
__wake_up_bit ▒
i915_gem_object_move_to_inactive ▒
bdi_wakeup_thread_delayed ▒
__test_set_page_writeback ▒
scsi_request_fn ▒
ext4_group_desc_csum ▒
__pagevec_lru_add_fn ▒
clear_page_dirty_for_io ▒
wb_writeback ▒
cfq_service_tree_add ▒
cache_grow ▒
__writeback_inodes_wb
我现在如何使用:ext4_bio_write_page 在 systemtap 中打印各种参数..我什至如何确定什么可能的参数是?
我想做类似的事情:
> stap -v -e 'probe ext4.ext4_bio_write_page?? { printf("%s %d", ???
并提取一些有趣的东西,比如 buffer_size 或 file_name - 我不知道具体是什么(我想一个一个地检查这些函数并查看它们的签名)。
[请注意我对此完全陌生,所以我可能犯了一些非常愚蠢的错误]
参见 systemtap tutorial 第 2.2 节 "what to print" 和第 3.2 节 "target variables"。简短摘录:
{ println($$vars) }
打印范围内的所有变量。 $foo$
漂亮打印 foo
对象,包括一级结构子字段。 $foo$$
漂亮的打印深度(受 MAXSTRINGLEN
限制)。
# stap -L 'kernel.function("foo")'
将打印出函数范围内的变量列表foo
。
我正在尝试找出这些写入我的闪存驱动器的原因。
deathstar> while true
> do
> dmesg|grep sdc|grep WRITE
> sleep 3
> done
[17967.580179] kworker/u4:2(6863): WRITE block 20971648 on sdc1 (8 sectors)
[17967.580206] kworker/u4:2(6863): WRITE block 20971784 on sdc1 (8 sectors)
[17967.580214] kworker/u4:2(6863): WRITE block 20971832 on sdc1 (8 sectors)
[17967.580222] kworker/u4:2(6863): WRITE block 21037080 on sdc1 (8 sectors)
我运行:
perf record -g -a
然后
perf report -s comm
得到
- 0.10% 0.10% kworker/u4:2 ▒
ext4_bio_write_page ▒
strnlen ▒
elv_rqhash_del.isra.5.part.6 ▒
find_get_pages ▒
find_get_pages_tag ▒
scsi_init_io ◆
ext4_mb_use_inode_pa ▒
cpuacct_charge ▒
i915_gem_retire_requests_ring ▒
cfq_insert_request ▒
i915_gem_free_request ▒
__wake_up_bit ▒
i915_gem_object_move_to_inactive ▒
bdi_wakeup_thread_delayed ▒
__test_set_page_writeback ▒
scsi_request_fn ▒
ext4_group_desc_csum ▒
__pagevec_lru_add_fn ▒
clear_page_dirty_for_io ▒
wb_writeback ▒
cfq_service_tree_add ▒
cache_grow ▒
__writeback_inodes_wb
我现在如何使用:ext4_bio_write_page 在 systemtap 中打印各种参数..我什至如何确定什么可能的参数是? 我想做类似的事情:
> stap -v -e 'probe ext4.ext4_bio_write_page?? { printf("%s %d", ???
并提取一些有趣的东西,比如 buffer_size 或 file_name - 我不知道具体是什么(我想一个一个地检查这些函数并查看它们的签名)。
[请注意我对此完全陌生,所以我可能犯了一些非常愚蠢的错误]
参见 systemtap tutorial 第 2.2 节 "what to print" 和第 3.2 节 "target variables"。简短摘录:
{ println($$vars) }
打印范围内的所有变量。 $foo$
漂亮打印 foo
对象,包括一级结构子字段。 $foo$$
漂亮的打印深度(受 MAXSTRINGLEN
限制)。
# stap -L 'kernel.function("foo")'
将打印出函数范围内的变量列表foo
。