systemtap: как определить события зонда и аргументы

Пытаюсь выяснить причину этих записей на флешку.

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)

я побежал:

производительная запись -g -a

а потом

отчет о производительности -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", ???

и извлечь что-то интересное, например, размер_буфера или имя_файла - я не знаю, что именно (я хочу пройтись по этим функциям одну за другой и посмотреть на их сигнатуры).

[Обратите внимание, что я совершенно новичок в этом, поэтому, возможно, я сделал несколько очень глупых ошибок]


person Community    schedule 04.10.2015    source источник
comment
в документах упоминается man stapprobes, но я не смог найти там ничего, связанного с ext4   -  person    schedule 04.10.2015
comment
я пробовал что-то вроде: stap -v -e 'модуль зонда (ext4). function (ext4_bio_write_page) {printf (hello\n); }', что бесполезно, но работает - мне нужны параметры для ext4_bio_write_page   -  person    schedule 04.10.2015
comment
stap -v -e 'модуль зонда (ext4). function (ext4_bio_write_page) {printf (hello %s (%s)\n, $$vars, $$parms); }' выводит полезную информацию.   -  person    schedule 04.10.2015


Ответы (1)


См. руководство по systemtap, раздел 2.2 "что печатать" и раздел 3.2 "целевые переменные". Краткий отрывок:

{ println($$vars) }

печатает все переменные в области видимости. $foo$ красиво печатает объект foo, включая один уровень подполей структуры. $foo$$ красиво печатает глубоко (с учетом MAXSTRINGLEN ограничений).

# stap -L 'kernel.function("foo")' 

распечатает список переменных в области действия функции foo.

person fche    schedule 04.10.2015
comment
спасибо за учебник - я понял ответ, но этот учебник превосходен. - person ; 05.10.2015