Не удается установить динамическую отладку ядра в Linux? - PullRequest
0 голосов
/ 06 мая 2018

Я уже видел Невозможно включить динамическую отладку ядра в Linux ; https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html.

Я пересобрал ядро ​​Raspbian 9 с CONFIG_DYNAMIC_DEBUG и загрузился в него; файл /sys/kernel/debug/dynamic_debug/control и заполняется 2k + операторами правил динамической отладки:

pi@raspberrypi:~ $ sudo ls -la /sys/kernel/debug/dynamic_debug/control
-rw-r--r-- 1 root root 0 Jan  1  1970 /sys/kernel/debug/dynamic_debug/control
pi@raspberrypi:~ $ sudo cat /sys/kernel/debug/dynamic_debug/control | wc -l
2358
pi@raspberrypi:~ $ sudo grep 'snd_device' /sys/kernel/debug/dynamic_debug/control
sound/core/device.c:132 [snd]snd_device_disconnect =_ "device disconnect %p (from %pS), not found\012"
sound/core/device.c:156 [snd]snd_device_free =_ "device free %p (from %pS), not found\012"

Хорошо, поэтому я хочу отследить функцию is_connected_output_ep , которая находится в sound / soc / soc-dapm.c . Итак, я делаю это:

pi@raspberrypi:~ $ sudo bash -c "echo -n 'func is_connected_output_ep +p' > /sys/kernel/debug/dynamic_debug/control"
pi@raspberrypi:~ $ sudo cat /sys/kernel/debug/dynamic_debug/control | grep is_conn
pi@raspberrypi:~ $ 
pi@raspberrypi:~ $ sudo bash -c "echo 'file sound/soc/soc-dapm.c line 1175 +p' > /sys/kernel/debug/dynamic_debug/control"
pi@raspberrypi:~ $ sudo cat /sys/kernel/debug/dynamic_debug/control | grep dapm
pi@raspberrypi:~ $ 

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

В документации сказано, что +p делает:

p    enables the pr_debug() callsite.

Я не уверен, что они подразумевают под этим - означает ли это, что если в функции уже есть операторы pr_debug, то они будут включены (т.е. будут печататься до syslog) с этим? Если так, что происходит в случае, когда в функции нет таких операторов - как в случае с is_connected_output_ep? Могу ли я все еще настроить динамическую отладку, чтобы как-то отследить эту функцию - без необходимости вручную вставлять printk или другие операторы и перекомпилировать модуль ядра?

1 Ответ

0 голосов
/ 06 мая 2018

Ну, я еще кое-что прочитал, и, кажется, ответ на этот вопрос:

означает ли это, что если в функции уже есть операторы 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 функциях драйверов модулей ядра ...

...