gpt4 book ai didi

linux - 无法在 Linux 上设置内核动态调试?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:46 25 4
gpt4 key购买 nike

我已经看到了Cannot enable kernel dynamic debugging on linux ; https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html .

我已经用 CONFIG_DYNAMIC_DEBUG 重建了 Raspbian 9 内核,并启动了它;文件 /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 或其他语句并重新编译内核模块?

最佳答案

好吧,我又读了一些书,答案似乎是:

does it mean that if there are already existing pr_debug statements in the function, then they will be enabled (i.e. will print to syslog) with this?

... 很可能是"is" - 因此您无法动态调试其中没有 pr_debug 语句的函数。

此外,/sys/kernel/debug/dynamic_debug/control(经阅读)似乎实际上是所有可能的动态调试“探测点”的列表,如果您愿意的话,连同它们状态(启用与否),尽管我对此不确定。

无论如何,这里有更多关于提到这些内容的阅读 Material :

所以我无法使用动态调试跟踪 is_connected_output_ep - 所以也许我应该研究一下 Linux 内核的 ftrace 或 kprobes(动态探测)工具...


编辑:事实证明,dynamic_debug/control 仅列出内核中当前加载模块的可调试语句!例如,soc-pcm.c源文件中的dpcm_path_get函数中有一个dev_dbg,最终在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 函数中监视打印输出。 .

关于linux - 无法在 Linux 上设置内核动态调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50198381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com