diff options
Diffstat (limited to 'md/writeup/kernel_debug_messages.md')
-rw-r--r-- | md/writeup/kernel_debug_messages.md | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/md/writeup/kernel_debug_messages.md b/md/writeup/kernel_debug_messages.md new file mode 100644 index 0000000..38b566a --- /dev/null +++ b/md/writeup/kernel_debug_messages.md @@ -0,0 +1,153 @@ +# Kernel debug messages + +## Intro + +Usaul way how to debug in kernel is by printing messages all over suspicioiuse +places and figure out where is the problem. + +## Loglevel errors + +Here is defintions of log levels from __include/linux/kern_levels.h__ + +```c +#define KERN_SOH "\001" /* ASCII Start Of Header */ +#define KERN_SOH_ASCII '\001' +``` + +| Name | Value | Descriptop | +| --- | --- | --- | +| KERN_EMERG | KERN_SOH "0" | system is unusable | +| KERN_ALERT | KERN_SOH "1" | action must be taken immediately | +| KERN_CRIT | KERN_SOH "2" | critical conditions | +| KERN_ERR | KERN_SOH "3" | error conditions | +| KERN_WARNING | KERN_SOH "4" | warning conditions | +| KERN_NOTICE | KERN_SOH "5" | normal but significant condition | +| KERN_INFO | KERN_SOH "6" | informational | +| KERN_DEBUG | KERN_SOH "7" | debug-level messages | +| KERN_DEFAULT | KERN_SOH "d" | the default kernel loglevel | + +As we can see kernel printk level is detemined from first bytes from begining of +printed string. Basic usage of log level + +``` +printk(KERN_ERR"Error division by 0\n"); +``` + +No need to write comma after log level as it will just concatenated with string. +[Source](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/printk.h?id=HEAD#n13) + +## Set loging level + +To see messages in userspace you can use +``` +dmesg +``` +Loged messages you can see in __/proc/sys/kernel/printk__ +``` +$ cat /proc/sys/kernel/printk + 7 4 1 7 +``` +Column values are +* current - 7 +* default - 4 +* minimum - 1 +* boot-time-default - 7 + +If one does not specify the log level then the default log level of KERN_WARNING is used. For example, enable all levels of console message: + +``` +echo 7 > /proc/sys/kernel/printk +``` + +If you are working on some device all output also could go to /dev/ttyUSB0 and +if you conected to that device with serial interface then you can see log +messages in your console. Sometime also /dev/tty1 could be as default output +for log messages. + +### Timing information +Timing information could be added to printk messages you need to enable in +menuconfig +__Kernel Hacking > printk and dmesg options >__ + +``` +CONFIG_PRINTK_TIME=y +``` + +### Loglevel at kernel boot +There is possible to set loglevel at bootup as kernel parametr +``` +loglevel= +``` +| Value | Name | Desc | +| --- | --- | --- | +| 0 | (KERN_EMERG) | system is unusable +| 1 | (KERN_ALERT) | action must be taken immediately +| 2 | (KERN_CRIT) | critical conditions +| 3 | (KERN_ERR) | error conditions +| 4 | (KERN_WARNING) | warning conditions +| 5 | (KERN_NOTICE) | normal but significant condition +| 6 | (KERN_INFO) | informational +| 7 | (KERN_DEBUG) | debug-level messages + +### Printk formating + +Here is defined formating specifiers __Documentation/printk-formats.txt__ + +| Type | printk format specifier | +| --- | --- | +| int |%d or %x| +| unsigned int |%u or %x| +| long |%ld or %lx| +| unsigned long |%lu or %lx| +| long long |%lld or %llx| +| unsigned long long |%llu or %llx| +| size_t |%zu or %zx| +| ssize_t |%zd or %zx| +| s32 |%d or %x| +| u32 |%u or %x| +| s64 |%lld or %llx| +| u64 |%llu or %llx| +| pointer |%p| +| function pointer with offset |%pF| +| function pointer without offset |%pf| +| symbol name with offset |%pS| +| symbol name without offset |%ps| +| symbol name with (with __builtin_extract_return_addr() translation) |%pSR| +| symbol name for printing backtraces |%pB| +| printing kernel pointers which should be hidden from unprivilege users |%pk| +| struct resources |%pr| +| struct resources with decoded flags member |%pR| +| phys_addr_t |%pa[p]| +| dma_addr_t |%pad| +| raw buffer as an escaped string |%*pE[achnops]| +| |a - ESCAPE_ANY| +| |c - ESCAPE_SPECIAL| +| |h - ESCAPE_HEX| +| |n - ESCAPE_NULL| +| |o - ESCAPE_OCTAL| +| |p - ESCAPE_NP| +| |s - ESCAPE_SPACE| +| Raw buffer as a hex string | %*ph, %*ph[CDN] | +| MAC/FDDI addresses | %p[M|MR|MF|m|mR] | +| IPv4 addresses | %p[Ii]4[hnbl] | +| IPv6 addresses | %p[I6|i6|I6c] | +| IPv4/IPv6 addresses (generic, with port, flowinfo, scope) | %p[Ii]S[pfschnbl] | +| UUID/GUID addresses | %pU[b|B|l|L] | +| dentry names | %pd{,2,3,4},%pD{,2,3,4} | +| block_device names | %pg | +| struct va_format | %pV | +| struct clk | %pC[nr] | +| bitmap,bitmap,nodemask | %*pb[l] | +| bitfields such as page flags, gfp_flags | %pG[pgv] | +| netdev_features_t | %pNF | + +## Links + +1. http://elinux.org/Debugging_by_printing +2. http://elinux.org/Kernel_Debugging_Tips +3. https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks +4. [Documentation/printk-formats.txt](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/printk-formats.txt?id=HEAD) +5. [include/linux/printk.h](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/printk.h?id=HEAD) +6. [include/linux/kern_levels.h](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/kern_levels.h?id=HEAD) +7. [lib/Kconfig.debug](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/lib/Kconfig.debug?id=HEAD) +8. [Documentation/kernel-parameters.txt](https://www.kernel.org/doc/Documentation/kernel-parameters.txt)
\ No newline at end of file |