据我所知,pr_debug
适用于Linux内核打印输出。
我见过的预期行为是,首先我们通过/sys/kernel/debug/dynamic_debug/control
检查可访问内核函数中的打印输出:
$ sudo grep class_release /sys/kernel/debug/dynamic_debug/control
drivers/base/class.c:55 [class]class_release =_ "class '%s': release.\012"
drivers/base/class.c:61 [class]class_release =_ "class '%s' does not have a release() function, be careful\012"
...然后我们通过以下方式启用这些打印输出:
$ sudo bash -c "echo 'file drivers/base/class.c +p' > /sys/kernel/debug/dynamic_debug/control"
...之后,无论何时调用给定的内核函数,我们都会在dmesg
或/var/log/syslog
中获得打印输出。
但是,我刚刚意识到用户空间程序中有pr_debug
个语句,特别是perf
- 例如,https://github.com/raspberrypi/linux/blob/rpi-4.14.y/tools/perf/builtin-probe.c#L70
(该代码中还有pr_warning
个语句 - 但所有这些语句似乎都在程序的stdout输出中打印出来没有问题)
所以,我见过https://www.kernel.org/doc/local/pr_debug.txt:
Some files call pr_debug(), which is ordinarily an empty macro that discards its arguments at compile time. To enable debugging output, build the appropriate file with -DDEBUG by adding CFLAGS_[filename].o := -DDEBUG to the makefile.
正确 - 所以我在https://github.com/raspberrypi/linux/blob/rpi-4.14.y/tools/perf/Makefile - >中添加了以下内容然后重新运行make ARCH=arm
,因为这是在Raspbian 9上......并且 - 没有任何改变,perf
与尝试启用调试之前的大小相同,并且没有消息打印在stdout或syslog
。我也试过
make ARCH=arm CFLAGS+=-DDEBUG
......也没有变化。
那么如何在pr_debug
这样的用户空间程序中启用perf
语句?如果它们被启用,我会在哪里看到它们:在程序的stdout中,就像在这种情况下的pr_warning
一样 - 或在dmesg
/ /var/log/syslog
中,这是典型的内核消息? / p>
编辑:我也尝试将#define DEBUG
添加到相关的.c文件中,并重新编译 - 再次,这些pr_debug
都不会在任何地方打印。
所以要澄清一下,并且有一个更明确的问题陈述:当我运行pr_debug
时,期望的行为是syslog
语句在某处(在stdout或perf
中)打印 - 目前的行为是,当我运行perf
时,这些消息似乎无法在任何地方打印出来。