最近在看overlay fs代码时发现里面有些函数里使用pr_debug加了一些打印信息。那么如何打开这个打印信息呢?
首先查看pr_debug的定义:
#if defined(CONFIG_DYNAMIC_DEBUG)
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
#define pr_debug(fmt, ...) \
dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...) \
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...) \
no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif
查看/boot下的内核配置文件config-*,可以知道已经定义了CONFIG_DYNAMIC_DEBUG。接下来只要在debugfs 里打开即可:
echo -n 'module overlay +p' ><debugfs>/dynamic_debug/control
<debugfs>是debugfs的挂载点,笔者的挂载点是:/sys/kernel/debug
同时需要更改日志打印级别使得Debug消息可以在控制台输出,echo 8 > /proc/sys/kernel/printk (仅仅用dmesg查看打印信息,不需要调节打印级别)
如果cat <debugfs>/dynamic_debug/control,可以看到内核支持的动态调试点:
...
net/ipv4/netfilter/nf_conntrack_proto_icmp.c:121 [nf_conntrack_ipv4]icmp_new =_ "icmp: can't create new conn with type %u\012"
net/ipv4/netfilter/nf_conntrack_proto_icmp.c:167 [nf_conntrack_ipv4]icmp_error_message =_ "icmp_error_message: no match\012"
net/ipv4/netfilter/nf_conntrack_proto_icmp.c:159 [nf_conntrack_ipv4]icmp_error_message =_ "icmp_error_message: no match\012"
net/ipv4/netfilter/nf_conntrack_proto_icmp.c:148 [nf_conntrack_ipv4]icmp_error_message =_ "icmp_error_message: failed to get tuple\012"
net/ipv4/netfilter/ipt_MASQUERADE.c:41 [ipt_MASQUERADE]masquerade_tg_check =_ "bad rangesize %u\012"
net/ipv4/netfilter/ipt_MASQUERADE.c:37 [ipt_MASQUERADE]masquerade_tg_check =_ "bad MAP_IPS.\012"
/root/overlayfs/overlayfs.h:130 [overlay]ovl_do_whiteout =_ "whiteout(%pd2) = %i\012"
/root/overlayfs/overlayfs.h:105 [overlay]ovl_do_removexattr =_ "removexattr(%pd2, \042%s\042) = %i\012"
/root/overlayfs/overlayfs.h:122 [overlay]ovl_do_rename =_ "...rename2(%pd2, %pd2, ...) = %i\012"
/root/overlayfs/overlayfs.h:116 [overlay]ovl_do_rename =_ "rename2(%pd2, %pd2, 0x%x)\012"
/root/overlayfs/overlayfs.h:98 [overlay]ovl_do_setxattr =_ "setxattr(%pd2, \042%s\042, \042%*s\042, 0x%x) = %i\012"
/root/overlayfs/overlayfs.h:89 [overlay]ovl_do_symlink =_ "symlink(\042%s\042, %pd2) = %i\012"
/root/overlayfs/overlayfs.h:79 [overlay]ovl_do_mknod =_ "mknod(%pd2, 0%o, 0%o) = %i\012"
/root/overlayfs/overlayfs.h:69 [overlay]ovl_do_mkdir =_ "mkdir(%pd2, 0%o) = %i\012"
/root/overlayfs/overlayfs.h:60 [overlay]ovl_do_create =_ "create(%pd2, 0%o) = %i\012"
/root/overlayfs/overlayfs.h:50 [overlay]ovl_do_link =_ "link(%pd2, %pd2) = %i\012"
/root/overlayfs/overlayfs.h:40 [overlay]ovl_do_unlink =_ "unlink(%pd2) = %i\012"
/root/overlayfs/overlayfs.h:33 [overlay]ovl_do_rmdir =_ "rmdir(%pd2) = %i\012"
/root/overlayfs/overlayfs.h:122 [overlay]ovl_do_rename =_ "...rename2(%pd2, %pd2, ...) = %i\012"
/root/overlayfs/overlayfs.h:116 [overlay]ovl_do_rename =_ "rename2(%pd2, %pd2, 0x%x)\012"
打印点可以更详细的控制,如只打开某个文件的某一行的打印,详细的使用见Linux kernel的Documentation/dynamic-debug-howto.txt