Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Linux上设置内核动态调试?_Linux_Debugging_Linux Kernel_Kernel - Fatal编程技术网

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

无法在Linux上设置内核动态调试?,linux,debugging,linux-kernel,kernel,Linux,Debugging,Linux Kernel,Kernel,我已经看过了 我用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_d

我已经看过了

我用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"
好的,我想跟踪函数,它在。所以我这样做:

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\u connected\u output\u ep
?我是否仍可以设置动态调试以某种方式跟踪此函数-而不必手动插入
printk
或其他语句并重新编译内核模块?

好吧,我又读了一些书,似乎可以回答:

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

。。。很可能是“是”-因此您无法对其中没有
pr_debug
语句的函数执行动态调试

另外,看起来
/sys/kernel/debug/dynamic_debug/control
(在读取时)实际上是所有可能的动态调试“探测点”的列表(如果您愿意),以及它们的状态(启用或不启用),尽管我不确定这一点

不管怎样,这里有更多的阅读,其中提到了这些东西:

  • 2011年
  • ,会议文件,2009年
因此,我无法通过动态调试跟踪
是否已连接\u输出\u ep
,因此,也许我应该研究一下Linux内核的ftrace或kprobes(动态探测)功能


编辑:原来,
dynamic_debug/control
只列出了内核中当前加载模块的可调试语句!例如,在
soc pcm.c
源文件的
dpcm\u path\u get
函数中有一个
dev\u dbg
,它最终位于
snd\u soc\u 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\u 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"
显然,禁用的行中有一个
=\ucode>符号,而启用的行中有
=p

现在我只想在加载驱动程序之前启用一些语句,这样我就可以监视内核模块驱动程序的
\u probe
函数中的打印输出