我已经看过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
或其他语句并重新编译内核模块?
2条答案
按热度按时间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不会加载这个模块,所以我们得到:现在,如果内核模块加载了
modprobe
,那么dynamic_debug/control
中会突然出现可调试的调用点:最后,我们现在可以启用这个print语句:
显然,禁用的行中有一个
=_
符号,而启用的行中有=p
...现在我想要做的就是 * 在 * 驱动程序加载之前启用一些语句,这样我就可以监控内核模块驱动程序的
_probe
函数中的打印输出...tjvv9vkg2#
您可以向insmod添加以下参数
动态数据库="+p”