summaryrefslogblamecommitdiffstats
path: root/md/writeup/kernel_debug_messages.md
blob: 1ff885427203fbb8edb92e14e5759a51639babaa (plain) (tree)
1
                            






























                                                                                
    








                                                                                                                 
     


                                                         
     










                                                                                                                                            
     












                                                                               
     




                                                              
     
































































                                                                                 



















                                                                                









                                                                                                                                                    
title: Kernel debug messages
# 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

```c
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 
```sh
dmesg
```
Loged messages you can see in __/proc/sys/kernel/printk__
```sh
$ 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:

```sh
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 >__ 

```sh
CONFIG_PRINTK_TIME=y
```

### Loglevel at kernel boot
There is possible to set loglevel at bootup as kernel parametr
```sh
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 |

## Shortened printk versions
Header files defines shortcut versions of print functions for each of log level.

| Function names | Note |
| --- | --- |
| pr_emerg | |
| pr_alert | |
| pr_crit | |
| pr_err | |
| pr_warn | |
| pr_notice | |
| pr_info | |
| no_printk | dummy printk without output |
| pr_devel | when DEBUG is defined |
| printk_once | print one time messages |
| printk_deferred_once | |
| pr_*_once | print once loglevel specific|
| printk_ratelimited | |
| pr_*_ratelimited | printk with loglevel and ratelimit |

## 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)