I am trying to understand a Linux kernel module and would like to see the output of pr_debug
and printk
. I am using GNU Make.
I understand that to get pr_debug messages, we have to use DDEBUG
.
So, how do I enable printk
statements ?
Lets say filename is kvm.c
. What is the difference between these two:
CFLAGS_kvm.o := -DDEBUG
CFLAGS_kvm.o += -DDEBUG
What does this statement do:
CFLAGS_kvm.o := -I.
[Edit]:
It looks like my usage of square brackets has caused some confusion. Actually by [filename], I meant some file, say kvm.c.
All printk() messages are printed to the kernel log buffer, which is a ring buffer exported to userspace through /dev/kmsg. The usual way to read it is using dmesg . The log level specifies the importance of a message.
printk is a C function from the Linux kernel interface that prints messages to the kernel log. It accepts a string parameter called the format string, which specifies a method for rendering an arbitrary number of varied data type parameter(s) into a string. The string is then printed to the kernel log.
pr_debug() 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 activate debug messages for core code and built-in modules during the boot process, even before userspace and debugfs exists, use dyndbg="QUERY" , module.
From https://www.kernel.org/doc/local/pr_debug.txt
:
pr_debug()
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.
For example, to see all attempts to spawn a usermode helper (such as
/sbin/hotplug), add to lib/Makefile the line:
CFLAGS_kobject_uevent.o := -DDEBUG
Then boot the new kernel, do something that spawns a usermode helper, and
use the "dmesg" command to view the pr_debug() output.
I don't know about how to activate printk()
- what did you search for with Google? Amongst other things, I found this which seems to imply the printk()
is almost always available (but you have to mark the messages with an appropriate level, and there is probably a control over which levels are displayed on the console).
The square brackets in a macro name are unorthodox - and therefore probably an extension specific to your system.
Reading between the lines, it is likely that you are talking about the Linux kernel and therefore GNU Make, but you'd help everyone if you stated such things.
The :=
notation is an immediate assignment to the variable. The RHS is evaluated when the line is read and processed, not when the macro is used as is normally the case. It means that if there are macros referenced on the RHS, subsequent changes to those macros will not affect the value of this macro. Consider:
CFLAGS = ${OFLAGS} ${IFLAGS} ${DFLAGS} ${WFLAGS}
CFLAGS := ${OFLAGS} ${IFLAGS} ${DFLAGS} ${WFLAGS}
The first variation notes that CFLAGS will be formed from the 4 named macros (well, actually, it simply copies the line ready for later expansion), but does not expand the values until it is used in (presumably) a C compilation command.
The second variation immediately looks for the values of the 4 macros at the time when the line is read and expands them out. Subsequent changes in the 4 referenced macros are not reflected in CFLAGS.
The +=
notation adds the RHS to the macro, rather than simply replacing it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With