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

时间:2018-05-06 09:51:38

标签: linux debugging linux-kernel kernel

我已经看过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或其他语句并重新编译内核模块?

1 个答案:

答案 0 :(得分:0)

好吧,我做了一些阅读,似乎是答案:

  

是否意味着如果函数中已经存在pr_debug语句,那么它们将被启用(即将打印到syslog)吗?

......很可能"是" - 所以你不能对已经没有pr_debug语句的函数进行动态调试。

此外,似乎/sys/kernel/debug/dynamic_debug/control(读取后)实际上是所有可能的动态调试"探测点的列表"如果你愿意的话,以及他们的状态(启用与否),虽然我对此不确定。

无论如何,这里有一些更多的阅读内容:

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

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