デバッグ情報のまとめpr_を印刷するdbug pr_err pr_info

1839 ワード

カーネルでは、デバッグ印刷情報がよく見られます.pr_debug,pr_Errなど.以前の理解では、エラーだけがprをErrの内容が印刷され、今は間違っているように見えます.pr_Errはperrorと同等ではない.
pr_についてerr,pr_debugの定義には2つあります.
第1種
(tools\perf\util\include\linux\Kernel.h)
int eprintf(int level,         const char *fmt, ...) __attribute__((format(printf, 2, 3)));
#define pr_err(fmt, ...)\    eprintf(0, pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warning(fmt, ...)\    eprintf(0, pr_fmt(fmt), ##__VA_ARGS__) #define pr_info(fmt, ...)\    eprintf(0, pr_fmt(fmt), ##__VA_ARGS__) #define pr_debug(fmt, ...)\    eprintf(1, pr_fmt(fmt), ##__VA_ARGS__) #define pr_debugN(n, fmt, ...)\    eprintf(n, pr_fmt(fmt), ##__VA_ARGS__)
第2種
(tools\virtio\linux\Virtio.h)
#define pr_err(format, ...) fprintf (stderr, format, ## __VA_ARGS__) #ifdef DEBUG #define pr_debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__) #else #define pr_debug(format, ...) do {} while (0) #endif#define dev_err(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__) #define dev_warn(dev, format, ...) fprintf (stderr, format, ## __VA_ARGS__)
最初の定義はpr_を見ることができますerr,pr_debug,pr_warning,pr_infoは実質的に同じで、eprintfはprintf関数です._attribute__((format(printf, 2, 3)));printfフォーマット文字列がprintfの2番目のパラメータから始まり、可変パラメータがprintfの3番目のパラメータから始まることを示します.attributeについてのご案内はこちらで承ります
したがって、カーネルコードにpr_が表示されるerr,pr_debug,pr_warning,pr_infoはいずれも端末に情報を印刷します.
2つ目の定義は、fprintfの理解が鍵です.
fprintf(stderr, "Can't open it!
"); fprintf(stdout, "Can't open it!
");
stdout --   (printf(".."))   stdout。
stderr --  
 。
 , 。stdout ,stderr 。

つまり両方とも端末画面に情報を印刷しなければならない.
【まとめ】:pr_err pr_debugなどが呼び出されると、前の文にエラーが発生しているかどうかにかかわらず、端末画面に印刷されます.いくつかの定義があるのは、コードがはっきりしているためです.