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

xzabzqsa  于 2023-01-04  发布在  Linux
关注(0)|答案(2)|浏览(237)

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

yc0p9oo0

yc0p9oo01#

嗯,我又读了些资料,似乎答案是:
这是否意味着如果函数中已经存在pr_debug语句,那么它们将被启用(即,将打印到syslog)?
...很可能是“yes”-所以不能对没有pr_debug语句的函数进行动态调试。
此外,/sys/kernel/debug/dynamic_debug/control(在读取时)似乎实际上是所有可能的动态调试“探测点”的列表,如果您愿意的话,沿着它们的状态(启用或未启用),尽管我不确定这一点。
无论如何,这里是一些更多的阅读,其中提到这件事:

所以我不能用动态调试来跟踪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"

最后,我们现在可以启用这个print语句:

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函数中的打印输出...

tjvv9vkg

tjvv9vkg2#

您可以向insmod添加以下参数
动态数据库="+p”

相关问题