背景
最近在调试个异常卡死的问题时,需要打印某个pcie link的,故学习了下内核里的打印,特此记录。
printk(“acpi_pci_link_set–>%pfwf, irq: %d\n”, &link->device->fwnode, irq);
内核中的格式化打印主要分为整型和指针。
整型
signed char %d or %hhx
unsigned char %u or %x
char %u or %x
short int %d or %hx
unsigned short int %u or %x
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
s8 %d or %hhx
u8 %u or %x
s16 %d or %hx
u16 %u or %x
s32 %d or %x
u32 %u or %x
s64 %lld or %llx
u64 %llu or %llx
内核的printf不支持%n,浮点型(%e, %f, %g, %a)等。
有些类型的大小依赖配置选项如(如sector_t, blkcnt_t)或架构(如 tcflag_t),这时使用其可能的最大类型的格式占位符并显式强制转换为它。
指针类型
内核支持扩展占位符来打印不同类型的指针,有些不止能够打印指针地址,还能打印给定地址上的数据,名称或者相关提示等。
目前支持的指针类型如下:
- 普通指针
- 错误指针
- 符号/函数指针
- 来自BPF / tracing追踪的探查指针
- 内核指针
- 未修改的地址
- 指针差异
- 结构体资源
- 物理地址类型phys_addr_t
- DMA地址类型dma_addr_t
- 原始缓冲区为转义字符串
- 原始缓冲区为hex字符串
- MAC/FDDI 地址
- IPv4 地址
- IPv6 地址
- IPv4/IPv6 地址 (generic, with port, flowinfo, scope)
- UUID/GUID 地址
- 目录项(dentry)的名称
- 块设备(block_device)名称
- va_format结构体
- 设备树节点
- Fwnode handles
- 时间和日期
- clk结构体
- 位图及其扩展,如cpumask和nodemask
- 标志位字段,如页标志、gfp_flags
- 网络设备特性
- V4L2和DRM FourCC代码(像素格式)
- Rust
下面展开几个可能比较常用的
符号/函数指针
.........
%pS versatile_init+0x0/0x110