Ну, я еще кое-что прочитал, и, кажется, ответ на этот вопрос:
означает ли это, что если в функции уже есть операторы pr_debug, то они будут включены (то есть будут печататься в системный журнал) с этим?
... скорее всего "да" - поэтому вы не можете выполнять динамическую отладку функции, в которой уже нет операторов pr_debug
.
Кроме того, кажется, что /sys/kernel/debug/dynamic_debug/control
(при чтении) на самом деле представляет собой список всех возможных динамических отладочных «зондов», если хотите, вместе с их состоянием (включено или нет), хотя я не уверен насчет это.
В любом случае, вот еще кое-что, где упоминается этот материал:
Так что я не могу отследить is_connected_output_ep
с помощью динамической отладки - так что, возможно, мне стоит изучить возможности ftrace или kprobes (динамические пробники) ядра Linux ...
РЕДАКТИРОВАТЬ: Оказывается, dynamic_debug/control
перечисляет отлаживаемые операторы ТОЛЬКО из загруженных в настоящее время модулей в ядре! Например, в исходном файле soc-pcm.c
есть функция dev_dbg
в функции dpcm_path_get
, которая заканчивается модулем ядра snd_soc_core
(snd-soc-core.ko
). Этот модуль по умолчанию не загружается Raspbian 9, поэтому мы получаем это:
pi@raspberrypi:~ $ lsmod | grep snd
snd_bcm2835 32768 1
snd_pcm 98304 1 snd_bcm2835
snd_timer 32768 1 snd_pcm
snd 69632 5 snd_timer,snd_bcm2835,snd_pcm
pi@raspberrypi:~ $ sudo grep 'soc-pcm' /sys/kernel/debug/dynamic_debug/control
pi@raspberrypi:~ $
Хорошо, теперь, если модуль ядра загружен с modprobe
, теперь внезапно отлаживаемые вызовы появляются в dynamic_debug/control
:
pi@raspberrypi:~ $ sudo modprobe snd_soc_core
pi@raspberrypi:~ $ lsmod | grep snd
snd_soc_core 200704 0
snd_compress 20480 1 snd_soc_core
snd_pcm_dmaengine 16384 1 snd_soc_core
snd_bcm2835 32768 1
snd_pcm 98304 3 snd_pcm_dmaengine,snd_bcm2835,snd_soc_core
snd_timer 32768 1 snd_pcm
snd 69632 7 snd_compress,snd_timer,snd_bcm2835,snd_soc_core,snd_pcm
pi@raspberrypi:~ $ sudo grep 'soc-pcm' /sys/kernel/debug/dynamic_debug/control
sound/soc/soc-pcm.c:1367 [snd_soc_core]dpcm_prune_paths =_ "ASoC: pruning %s BE %s for %s\012"
sound/soc/soc-pcm.c:1373 [snd_soc_core]dpcm_prune_paths =_ "ASoC: found %d old BE paths for pruning\012"
...
pi@raspberrypi:~ $ sudo grep 'dpcm_path_get' /sys/kernel/debug/dynamic_debug/control
sound/soc/soc-pcm.c:1331 [snd_soc_core]dpcm_path_get =_ "ASoC: found %d audio %s paths\012"
И, наконец, теперь мы можем включить этот оператор печати:
pi@raspberrypi:~ $ sudo bash -c "echo 'func dpcm_path_get +p' > /sys/kernel/debug/dynamic_debug/control"
pi@raspberrypi:~ $ sudo grep 'dpcm_path_get' /sys/kernel/debug/dynamic_debug/control
sound/soc/soc-pcm.c:1331 [snd_soc_core]dpcm_path_get =p "ASoC: found %d audio %s paths\012"
Видимо, отключенные строки имеют символ =_
в строке, а разрешенные строки имеют =p
...
Теперь все, что мне нужно, это включить некоторые операторы до загрузки драйвера, чтобы я мог отслеживать распечатки в _probe
функциях драйверов модулей ядра ...