fisphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/core-api/printk-basicsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/zh_TW/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/it_IT/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ja_JP/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/ko_KR/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget*/translations/sp_SP/core-api/printk-basicsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhW/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/printk-basics.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h)Documentation/core-api/printk-basics.rst h]h)}(h(Documentation/core-api/printk-basics.rsth]h(Documentation/core-api/printk-basics.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h\司延腾 Yanteng Si 周彬彬 Binbin Zhou h]h)}(h[司延腾 Yanteng Si 周彬彬 Binbin Zhou h](h司延腾 Yanteng Si <}(hj hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j(hj ubh> 周彬彬 Binbin Zhou <}(hj hhhNhNubj))}(hzhoubinbin@loongson.cnh]hzhoubinbin@loongson.cn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:zhoubinbin@loongson.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h.. _cn_printk-basics.rst:h]h}(h]h ]h"]h$]h&]refidcn-printk-basics-rstuh1jjhKhhhhhhubhsection)}(hhh](htitle)}(h使用printk记录消息h]h使用printk记录消息}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j}hjzhhhhhKubh)}(hXprintk()是Linux内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试 的最基本方法。如果你熟悉printf(3),你就能够知道printk()是基于它的,尽管它在功能上有一些不 同之处:h]hXprintk()是Linux内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试 的最基本方法。如果你熟悉printf(3),你就能够知道printk()是基于它的,尽管它在功能上有一些不 同之处:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh block_quote)}(hX$- printk() 消息可以指定日志级别。 - 格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。 h]h bullet_list)}(hhh](h list_item)}(h+printk() 消息可以指定日志级别。 h]h)}(h*printk() 消息可以指定日志级别。h]h*printk() 消息可以指定日志级别。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。 h]h)}(h格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 ``%n`` 或浮点转换指定符)。参见:ref: `如何正确地获得printk格式指定符` 。h](h}格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没 有 }(hjhhhNhNubhliteral)}(h``%n``h]h%n}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ 或浮点转换指定符)。参见:ref: }(hjhhhNhNubhtitle_reference)}(h?`如何正确地获得printk格式指定符`h]h=如何正确地获得printk格式指定符}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjzhhubh)}(h所有的printk()消息都会被打印到内核日志缓冲区,这是一个通过/dev/kmsg输出到用户空间的环 形缓冲区。读取它的通常方法是使用 ``dmesg`` 。h](h所有的printk()消息都会被打印到内核日志缓冲区,这是一个通过/dev/kmsg输出到用户空间的环 形缓冲区。读取它的通常方法是使用 }(hjhhhNhNubj)}(h ``dmesg``h]hdmesg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh)}(h%printk()的用法通常是这样的::h]h$printk()的用法通常是这样的:}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzhhubh literal_block)}(h'printk(KERN_INFO "Message: %s\n", arg);h]h'printk(KERN_INFO "Message: %s\n", arg);}hj>sbah}(h]h ]h"]h$]h&]hhuh1j<hhhKhjzhhubh)}(h其中 ``KERN_INFO`` 是日志级别(注意,它与格式字符串连在一起,日志级别不是一个单独的参数)。 可用的日志级别是:h](h其中 }(hjLhhhNhNubj)}(h ``KERN_INFO``h]h KERN_INFO}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh 是日志级别(注意,它与格式字符串连在一起,日志级别不是一个单独的参数)。 可用的日志级别是:}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK!hjzhhubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jvhjsubjw)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jvhjsubjw)}(hhh]h}(h]h ]h"]h$]h&]colwidthK/uh1jvhjsubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(h名称h]h名称}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 字符串h]h 字符串}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 别名函数h]h 别名函数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjsubhtbody)}(hhh](j)}(hhh](j)}(hhh]h)}(h KERN_EMERGh]h KERN_EMERG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"0"h]h“0”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_emerg()h]h pr_emerg()}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj)ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_ALERTh]h KERN_ALERT}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjIubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(h"1"h]h“1”}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hj`ubah}(h]h ]h"]h$]h&]uh1jhjFubj)}(hhh]h)}(h pr_alert()h]h pr_alert()}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjwubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_CRITh]h KERN_CRIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"2"h]h“2”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_crit()h]h pr_crit()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hKERN_ERRh]hKERN_ERR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"3"h]h“3”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hpr_err()h]hpr_err()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_WARNINGh]h KERN_WARNING}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hj3ubah}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh]h)}(h"4"h]h“4”}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjJubah}(h]h ]h"]h$]h&]uh1jhj0ubj)}(hhh]h)}(h pr_warn()h]h pr_warn()}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjaubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_NOTICEh]h KERN_NOTICE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hhh]h)}(h"5"h]h“5”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hhh]h)}(h pr_notice()h]h pr_notice()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_INFOh]h KERN_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"6"h]h“6”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_info()h]h pr_info()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_DEBUGh]h KERN_DEBUG}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"7"h]h“7”}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hj4ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h,pr_debug() and pr_devel() 若定义了DEBUGh]h,pr_debug() and pr_devel() 若定义了DEBUG}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjKubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_DEFAULTh]h KERN_DEFAULT}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjkubah}(h]h ]h"]h$]h&]uh1jhjhubj)}(hhh]h)}(h""h]h“”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhjhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(h KERN_CONTh]h KERN_CONT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"c"h]h“c”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h pr_cont()h]h pr_cont()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]colsKuh1jqhjnubah}(h]h ]h"]h$]h&]uh1jlhjzhhhhhNubh)}(hX5日志级别指定了一条消息的重要性。内核根据日志级别和当前 *console_loglevel* (一个内核变量)决 定是否立即显示消息(将其打印到当前控制台)。如果消息的优先级比 *console_loglevel* 高(日志级 别值较低),消息将被打印到控制台。h](hR日志级别指定了一条消息的重要性。内核根据日志级别和当前 }(hj hhhNhNubhemphasis)}(h*console_loglevel*h]hconsole_loglevel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh{ (一个内核变量)决 定是否立即显示消息(将其打印到当前控制台)。如果消息的优先级比 }(hj hhhNhNubj)}(h*console_loglevel*h]hconsole_loglevel}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhD 高(日志级 别值较低),消息将被打印到控制台。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK>hjzhhubh)}(hK如果省略了日志级别,则以 ``KERN_DEFAULT`` 级别打印消息。h](h%如果省略了日志级别,则以 }(hj=hhhNhNubj)}(h``KERN_DEFAULT``h]h KERN_DEFAULT}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh 级别打印消息。}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKBhjzhhubh)}(h=你可以用以下方法检查当前的 *console_loglevel* ::h](h(你可以用以下方法检查当前的 }(hj]hhhNhNubj)}(h*console_loglevel*h]hconsole_loglevel}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1hhhhKDhjzhhubj=)}(h:$ cat /proc/sys/kernel/printk 4 4 1 7h]h:$ cat /proc/sys/kernel/printk 4 4 1 7}hjysbah}(h]h ]h"]h$]h&]hhuh1j<hhhKFhjzhhubh)}(hT结果显示了 *current*, *default*, *minimum* 和 *boot-time-default* 日志级别h](h结果显示了 }(hjhhhNhNubj)}(h *current*h]hcurrent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h *default*h]hdefault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }hjsbj)}(h *minimum*h]hminimum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h*boot-time-default*h]hboot-time-default}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 日志级别}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjzhhubh)}(h要改变当前的 console_loglevel,只需在 ``/proc/sys/kernel/printk`` 中写入所需的 级别。例如,要打印所有的消息到控制台上::h](h0要改变当前的 console_loglevel,只需在 }(hjhhhNhNubj)}(h``/proc/sys/kernel/printk``h]h/proc/sys/kernel/printk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhN 中写入所需的 级别。例如,要打印所有的消息到控制台上:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKKhjzhhubj=)}(h"# echo 8 > /proc/sys/kernel/printkh]h"# echo 8 > /proc/sys/kernel/printk}hjsbah}(h]h ]h"]h$]h&]hhuh1j<hhhKNhjzhhubh)}(h$另一种方式,使用 ``dmesg``::h](h另一种方式,使用 }(hj hhhNhNubj)}(h ``dmesg``h]hdmesg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKPhjzhhubj=)}(h # dmesg -n 5h]h # dmesg -n 5}hj+sbah}(h]h ]h"]h$]h&]hhuh1j<hhhKRhjzhhubh)}(hx设置 console_loglevel 打印 KERN_WARNING (4) 或更严重的消息到控制台。更多消息参 见 ``dmesg(1)`` 。h](hh设置 console_loglevel 打印 KERN_WARNING (4) 或更严重的消息到控制台。更多消息参 见 }(hj9hhhNhNubj)}(h ``dmesg(1)``h]hdmesg(1)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh 。}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKThjzhhubh)}(h作为printk()的替代方案,你可以使用 ``pr_*()`` 别名来记录日志。这个系列的宏在宏名中 嵌入了日志级别。例如::h](h0作为printk()的替代方案,你可以使用 }(hjYhhhNhNubj)}(h ``pr_*()``h]hpr_*()}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubhW 别名来记录日志。这个系列的宏在宏名中 嵌入了日志级别。例如:}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKWhjzhhubj=)}(h*pr_info("Info message no. %d\n", msg_num);h]h*pr_info("Info message no. %d\n", msg_num);}hjysbah}(h]h ]h"]h$]h&]hhuh1j<hhhKZhjzhhubh)}(h打印 ``KERN_INFO`` 消息。h](h打印 }(hjhhhNhNubj)}(h ``KERN_INFO``h]h KERN_INFO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 消息。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK\hjzhhubh)}(h除了比等效的printk()调用更简洁之外,它们还可以通过pr_fmt()宏为格式字符串使用一个通用 的定义。例如,在源文件的顶部(在任何 ``#include`` 指令之前)定义这样的内容。::h](h除了比等效的printk()调用更简洁之外,它们还可以通过pr_fmt()宏为格式字符串使用一个通用 的定义。例如,在源文件的顶部(在任何 }(hjhhhNhNubj)}(h ``#include``h]h#include}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) 指令之前)定义这样的内容。:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK^hjzhhubj=)}(h;#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__h]h;#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__}hjsbah}(h]h ]h"]h$]h&]hhuh1j<hhhKahjzhhubh)}(h_会在该文件中的每一条 pr_*() 消息前加上发起该消息的模块和函数名称。h]h_会在该文件中的每一条 pr_*() 消息前加上发起该消息的模块和函数名称。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjzhhubh)}(h为了调试,还有两个有条件编译的宏: pr_debug()和pr_devel(),除非定义了 ``DEBUG`` (或者在pr_debug()的情况下定义了 ``CONFIG_DYNAMIC_DEBUG`` ),否则它们不会被编译。h](h^为了调试,还有两个有条件编译的宏: pr_debug()和pr_devel(),除非定义了 }(hjhhhNhNubj)}(h ``DEBUG``h]hDEBUG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ (或者在pr_debug()的情况下定义了 }(hjhhhNhNubj)}(h``CONFIG_DYNAMIC_DEBUG``h]hCONFIG_DYNAMIC_DEBUG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# ),否则它们不会被编译。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKehjzhhubjy)}(hhh](j~)}(h 函数接口h]h 函数接口}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j}hjhhhhhKkubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKmhjhhubh)}(hinclude/linux/printk.hh]hinclude/linux/printk.h}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjhhubeh}(h]id1ah ]h"] 函数接口ah$]h&]uh1jxhjzhhhhhKkubeh}(h](printkjweh ]h"](使用printk记录消息cn_printk-basics.rsteh$]h&]uh1jxhhhhhhhKexpect_referenced_by_name}jPjlsexpect_referenced_by_id}jwjlsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j}N generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjyerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}jw]jlasnameids}(jPjwjOjLjGjDu nametypes}(jPjOjGuh}(jwjzjLjzjDju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]hsystem_message)}(hhh]h)}(heUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.h]hgUnexpected possible title overline or transition. Treating it as ordinary text because it’s so short.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOlineK9sourcehuh1jhjubatransform_messages]j)}(hhh]h)}(hhh]h:Hyperlink target "cn-printk-basics-rst" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKuh1juba transformerN include_log];Documentation/translations/zh_CN/core-api/printk-basics.rst(NNNNta decorationNhhub.