.. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` :Translator: 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> :æ ¡è¯‘: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_coding: 使代ç æ£ç¡® ====================== 虽然一个åšå®žçš„ã€é¢å‘社区的设计过程有很多值得说é“çš„ï¼Œä½†æ˜¯ä»»ä½•å†…æ ¸å¼€å‘项目工作 çš„è¯æ˜Žéƒ½åæ˜ åœ¨ä»£ç ä¸ã€‚它是将由其他开å‘人员检查并åˆå¹¶ï¼ˆæˆ–ä¸åˆå¹¶ï¼‰åˆ°ä¸»çº¿æ ‘ä¸ çš„ä»£ç 。所以这段代ç çš„è´¨é‡å†³å®šäº†é¡¹ç›®çš„最终æˆåŠŸã€‚ 本节将检查编ç è¿‡ç¨‹ã€‚æˆ‘ä»¬å°†ä»Žå†…æ ¸å¼€å‘äººå‘˜å¸¸çŠ¯çš„å‡ ç§é”™è¯¯å¼€å§‹ã€‚然åŽé‡ç‚¹å°†è½¬ç§» 到æ£ç¡®çš„åšæ³•å’Œç›¸å…³æœ‰ç”¨çš„工具上。 陷阱 ---- 代ç é£Žæ ¼ ******** å†…æ ¸é•¿æœŸä»¥æ¥éƒ½æœ‰å…¶æ ‡å‡†çš„代ç é£Žæ ¼ï¼Œå¦‚ :ref:`Documentation/translations/zh_CN/process/coding-style.rst <cn_codingstyle>` ä¸æ‰€è¿°ã€‚在多数时候,该文档ä¸æè¿°çš„å‡†åˆ™è‡³å¤šè¢«è®¤ä¸ºæ˜¯å»ºè®®æ€§çš„ã€‚å› æ¤ï¼Œå†…æ ¸ä¸å˜åœ¨ 大é‡ä¸ç¬¦åˆä»£ç é£Žæ ¼å‡†åˆ™çš„ä»£ç 。这ç§ä»£ç çš„å˜åœ¨ä¼šç»™å†…æ ¸å¼€å‘人员带æ¥ä¸¤æ–¹é¢çš„å±å®³ã€‚ é¦–å…ˆï¼Œç›¸ä¿¡å†…æ ¸ä»£ç æ ‡å‡†å¹¶ä¸é‡è¦ï¼Œä¹Ÿä¸å¼ºåˆ¶æ‰§è¡Œã€‚ä½†äº‹å®žä¸Šï¼Œå¦‚æžœæ²¡æœ‰æŒ‰ç…§æ ‡å‡† 编写代ç ,那么新代ç å°†å¾ˆéš¾åŠ å…¥åˆ°å†…æ ¸ä¸ï¼›è®¸å¤šå¼€å‘人员甚至会在审查代ç 之å‰è¦æ±‚ 对代ç 进行é‡æ–°æ ¼å¼åŒ–。一个åƒå†…æ ¸è¿™ä¹ˆå¤§çš„ä»£ç 库需è¦ä¸€äº›ç»Ÿä¸€æ ¼å¼çš„代ç ,以使 å¼€å‘人员能够快速ç†è§£å…¶ä¸çš„任何部分。所以å†ä¹Ÿç»ä¸èµ·å¥‡æ€ªæ ¼å¼çš„代ç 的折腾了。 å†…æ ¸çš„ä»£ç é£Žæ ¼å¶å°”ä¼šä¸Žé›‡ä¸»çš„å¼ºåˆ¶é£Žæ ¼å‘生冲çªã€‚在这ç§æƒ…况下,必须在代ç åˆå¹¶ 之å‰éµä»Žå†…æ ¸ä»£ç é£Žæ ¼ã€‚å°†ä»£ç æ”¾å…¥å†…æ ¸æ„味ç€ä»¥å¤šç§æ–¹å¼æ”¾å¼ƒä¸€å®šç¨‹åº¦çš„控制æƒâ€”— 包括控制代ç æ ·å¼ã€‚ å¦ä¸€ä¸ªå±å®³æ˜¯è®¤ä¸ºå·²ç»åœ¨å†…æ ¸ä¸çš„代ç 迫切需è¦ä¿®å¤ä»£ç æ ·å¼ã€‚å¼€å‘者å¯èƒ½ä¼šå¼€å§‹ç¼–写 é‡æ–°æ ¼å¼åŒ–è¡¥ä¸ï¼Œä½œä¸ºç†Ÿæ‚‰å¼€å‘过程的一ç§æ–¹å¼ï¼Œæˆ–者作为将其åå—å†™å…¥å†…æ ¸å˜æ›´æ—¥å¿— 的一ç§æ–¹å¼ï¼Œæˆ–者两者兼而有之。但是纯代ç é£Žæ ¼çš„ä¿®å¤è¢«å¼€å‘社区视为噪音,它们往 å¾€å—到冷é‡ã€‚å› æ¤ï¼Œæœ€å¥½é¿å…编写这ç§ç±»åž‹çš„è¡¥ä¸ã€‚åœ¨ç”±äºŽå…¶ä»–åŽŸå› å¤„ç†ä¸€æ®µä»£ç çš„ åŒæ—¶é¡ºå¸¦ä¿®å¤å…¶æ ·å¼æ˜¯å¾ˆè‡ªç„¶çš„,但是ä¸åº”该仅为了更改代ç æ ·å¼è€Œæ›´æ”¹ä¹‹ã€‚ 代ç é£Žæ ¼æ–‡æ¡£ä¹Ÿä¸åº”该被视为ç»å¯¹ä¸å¯è¿å的规则。如果有一个足够的ç†ç”±åå¯¹è¿™ç§ æ ·å¼ï¼ˆä¾‹å¦‚为了80列é™åˆ¶æ‹†åˆ†è¡Œä¼šå¯¼è‡´å¯è¯»æ€§å¤§å¤§é™ä½Žï¼‰ï¼Œé‚£ä¹ˆå°±è¿™æ ·åšå§ã€‚ 注æ„您还å¯ä»¥ä½¿ç”¨ ``clang-format`` 工具æ¥å¸®åŠ©æ‚¨å¤„ç†è¿™äº›è§„则,快速自动é‡æ–°æ ¼å¼ 化部分代ç ,和审阅完整的文件以å‘现代ç æ ·å¼é”™è¯¯ã€æ‹¼å†™é”™è¯¯å’Œå¯èƒ½çš„改进。它还 å¯ä»¥æ–¹ä¾¿åœ°æŽ’åº ``#includes`` ã€å¯¹é½å˜é‡/å®ã€é‡æŽ’文本和其他类似任务。有关详细 ä¿¡æ¯ï¼Œè¯·å‚阅文档 :ref:`Documentation/process/clang-format.rst <clangformat>` 抽象层 ****** 计算机科å¦æ•™æŽˆæ•™å¦ç”Ÿä»¥çµæ´»æ€§å’Œä¿¡æ¯éšè—çš„åä¹‰å¹¿æ³›ä½¿ç”¨æŠ½è±¡å±‚ã€‚å½“ç„¶ï¼Œå†…æ ¸å¹¿æ³› 地使用了抽象;任何涉åŠæ•°ç™¾ä¸‡è¡Œä»£ç 的项目都必须åšåˆ°è¿™ä¸€ç‚¹ä»¥å˜ç»ä¸‹æ¥ã€‚但ç»éªŒ 表明,过度或过早的抽象å¯èƒ½å’Œè¿‡æ—©çš„ä¼˜åŒ–ä¸€æ ·æœ‰å®³ã€‚æŠ½è±¡åº”ç”¨åœ¨é€‚å½“å±‚çº§ï¼Œ ä¸è¦è¿‡åº¦ã€‚ 简å•ç‚¹ï¼Œå…ˆè€ƒè™‘一个调用时始终åªæœ‰ä¸€ä¸ªå‚数且总为零的函数。我们å¯ä»¥ä¿ç•™è¿™ä¸ªå‚数, 以在需è¦ä½¿ç”¨å®ƒæ—¶æ供的é¢å¤–çµæ´»æ€§ã€‚ä¸è¿‡ï¼Œåœ¨é‚£æ—¶å®žçŽ°äº†è¿™ä¸ªé¢å¤–å‚数的代ç 很有 å¯èƒ½ä»¥æŸç§ä»Žæœªè¢«æ³¨æ„到的微妙方å¼è¢«ç ´åâ€”â€”å› ä¸ºå®ƒä»Žæœªè¢«ä½¿ç”¨è¿‡ã€‚æˆ–è€…å½“éœ€è¦é¢å¤– çš„çµæ´»æ€§æ—¶ï¼Œå®ƒå¹¶æœªä»¥ç¬¦åˆç¨‹åºå‘˜å½“åˆæœŸæœ›çš„æ–¹å¼æ¥å®žçŽ°ã€‚å†…æ ¸å¼€å‘人员通常会æ交 è¡¥ä¸æ¥åˆ 除未使用的å‚数;一般æ¥è¯´ï¼Œä¸€å¼€å§‹å°±ä¸åº”è¯¥æ·»åŠ è¿™äº›å‚数。 éšè—硬件访问的抽象层——通常为了å…许大é‡çš„驱动程åºå…¼å®¹å¤šä¸ªæ“作系统——尤其ä¸å— æ¬¢è¿Žã€‚è¿™æ ·çš„å±‚ä½¿ä»£ç å˜å¾—模糊,å¯èƒ½ä¼šé€ æˆæ€§èƒ½æŸå¤±ï¼›å®ƒä»¬ä¸å±žäºŽLinuxå†…æ ¸ã€‚ å¦ä¸€æ–¹é¢ï¼Œå¦‚果您å‘现自己从å¦ä¸€ä¸ªå†…æ ¸å系统å¤åˆ¶äº†å¤§é‡çš„代ç ,那么是时候 了解一下:是å¦éœ€è¦å°†è¿™äº›ä»£ç ä¸çš„部分æå–到å•ç‹¬çš„库ä¸ï¼Œæˆ–者在更高的层次上 å®žçŽ°è¿™äº›åŠŸèƒ½ã€‚åœ¨æ•´ä¸ªå†…æ ¸ä¸å¤åˆ¶ç›¸åŒçš„代ç 没有价值。 #ifdef å’Œé¢„å¤„ç† *************** C预处ç†å™¨ä¼¼ä¹Žç»™ä¸€äº›C程åºå‘˜å¸¦æ¥äº†å¼ºå¤§çš„诱惑,他们认为它是一ç§å°†å¤§é‡çµæ´»æ€§åŠ å…¥ æºä»£ç ä¸çš„方法。但是预处ç†å™¨ä¸æ˜¯C,大é‡ä½¿ç”¨å®ƒä¼šå¯¼è‡´ä»£ç 对其他人æ¥è¯´æ›´éš¾é˜…读, 对编译器æ¥è¯´æ›´éš¾æ£€æŸ¥æ£ç¡®æ€§ã€‚使用了大é‡é¢„处ç†å™¨å‡ 乎总是代ç 需è¦ä¸€äº› 清ç†å·¥ä½œçš„æ ‡å¿—ã€‚ 使用#ifdefçš„æ¡ä»¶ç¼–è¯‘å®žé™…ä¸Šæ˜¯ä¸€ä¸ªå¼ºå¤§çš„åŠŸèƒ½ï¼Œå®ƒåœ¨å†…æ ¸ä¸ä½¿ç”¨ã€‚但是很少有人希望 看到代ç 被铺满#ifdefå—。一般规定,ifdef的使用应尽å¯èƒ½é™åˆ¶åœ¨å¤´æ–‡ä»¶ä¸ã€‚æ¡ä»¶ 编译代ç å¯ä»¥é™åˆ¶å‡½æ•°ï¼Œå¦‚果代ç ä¸å˜åœ¨ï¼Œè¿™äº›å‡½æ•°å°±ç›´æŽ¥å˜æˆç©ºçš„。然åŽç¼–译器将 悄悄地优化对空函数的调用。使得代ç æ›´åŠ æ¸…æ™°ï¼Œæ›´å®¹æ˜“ç†è§£ã€‚ C预处ç†å™¨å®å˜åœ¨è®¸å¤šå±é™©æ€§ï¼ŒåŒ…括å¯èƒ½å¯¹å…·æœ‰å‰¯ä½œç”¨ä¸”没有类型安全的表达å¼è¿›è¡Œå¤š é‡è¯„估。如果您试图定义å®ï¼Œè¯·è€ƒè™‘创建一个内è”函数替代。结果相åŒçš„代ç ï¼Œå†…è” å‡½æ•°æ›´å®¹æ˜“é˜…è¯»ï¼Œä¸ä¼šå¤šæ¬¡è®¡ç®—å…¶å‚数,并且å…许编译器对å‚数和返回值执行类型检查。 内è”函数 ******** ä¸è¿‡ï¼Œå†…è”函数本身也å˜åœ¨é£Žé™©ã€‚程åºå‘˜å¯ä»¥å€¾å¿ƒäºŽé¿å…函数调用和用内è”å‡½æ•°å¡«å……æº æ–‡ä»¶æ‰€å›ºæœ‰çš„æ•ˆçŽ‡ã€‚ç„¶è€Œï¼Œè¿™äº›åŠŸèƒ½å®žé™…ä¸Šä¼šé™ä½Žæ€§èƒ½ã€‚å› ä¸ºå®ƒä»¬çš„ä»£ç 在æ¯ä¸ªè°ƒç”¨ç«™ 点都被å¤åˆ¶ä¸€éï¼Œæ‰€ä»¥æœ€ç»ˆä¼šå¢žåŠ ç¼–è¯‘å†…æ ¸çš„å¤§å°ã€‚æ¤å¤–,这也对处ç†å™¨çš„内å˜ç¼“å˜ é€ æˆåŽ‹åŠ›ï¼Œä»Žè€Œå¤§å¤§é™ä½Žæ‰§è¡Œé€Ÿåº¦ã€‚通常内è”函数应该éžå¸¸å°ï¼Œè€Œä¸”相对较少。毕竟 函数调用的æˆæœ¬å¹¶ä¸é«˜ï¼›å¤§é‡åˆ›å»ºå†…è”函数是过早优化的典型例å。 一般æ¥è¯´ï¼Œå†…æ ¸ç¨‹åºå‘˜ä¼šè‡ªå†’风险忽略缓å˜æ•ˆæžœã€‚在数æ®ç»“构课程开头ä¸çš„ç»å…¸ 时间/空间æƒè¡¡é€šå¸¸ä¸é€‚用于当代硬件。空间 *就是* æ—¶é—´ï¼Œå› ä¸ºä¸€ä¸ªå¤§çš„ç¨‹åºæ¯”一个 更紧凑的程åºè¿è¡Œå¾—慢。 较新的编译器越æ¥è¶Šæ¿€è¿›åœ°å†³å®šä¸€ä¸ªç»™å®šå‡½æ•°æ˜¯å¦åº”该内è”ã€‚å› æ¤ï¼Œéšæ„放置使用 “inlineâ€å…³é”®å—å¯èƒ½ä¸ä»…仅是过度的,也å¯èƒ½æ˜¯æ— 用的。 é” ** 2006å¹´5月,“deviceescapeâ€ç½‘ç»œå †æ ˆåœ¨å‰å‘¼åŽæ‹¥ä¸‹ä»¥GPLå‘å¸ƒï¼Œå¹¶è¢«çº³å…¥ä¸»çº¿å†…æ ¸ã€‚ 这是一个å—欢迎的消æ¯ï¼›Linuxä¸å¯¹æ— 线网络的支æŒå……å…¶é‡è¢«è®¤ä¸ºæ˜¯ä¸åˆæ ¼çš„,而 Deviceescapeå †æ ˆæ‰¿è¯ºä¿®å¤è¿™ç§æƒ…况。然而直到2007å¹´6月(2.6.22),这段代ç æ‰çœŸ æ£è¿›å…¥ä¸»çº¿ã€‚å‘生了什么? 这段代ç 出现了许多é—é—¨é€ è½¦çš„è¿¹è±¡ã€‚ä½†ä¸€ä¸ªå¤§éº»çƒ¦æ˜¯ï¼Œå®ƒå¹¶ä¸æ˜¯ä¸ºå¤šå¤„ç†å™¨ç³»ç»Ÿè€Œ 设计。在åˆå¹¶è¿™ä¸ªç½‘ç»œå †æ ˆï¼ˆçŽ°åœ¨ç§°ä¸ºmac80211)之å‰ï¼Œéœ€è¦å¯¹å…¶è¿›è¡Œä¸€ä¸ªé”方案的 æ”¹é€ ã€‚ 曾ç»ï¼ŒLinuxå†…æ ¸ä»£ç å¯ä»¥åœ¨ä¸è€ƒè™‘多处ç†å™¨ç³»ç»Ÿæ‰€å¸¦æ¥çš„并å‘性问题的情况下进行 å¼€å‘。然而现在,这个文档就是在åŒæ ¸ç¬”记本电脑上写的。å³ä½¿åœ¨å•å¤„ç†å™¨ç³»ç»Ÿä¸Šï¼Œ 为æ高å“应能力所åšçš„工作也会æé«˜å†…æ ¸å†…çš„å¹¶å‘æ€§æ°´å¹³ã€‚ç¼–å†™å†…æ ¸ä»£ç 而ä¸è€ƒè™‘é” çš„æ—¥å早已远去。 å¯ä»¥ç”±å¤šä¸ªçº¿ç¨‹å¹¶å‘访问的任何资æºï¼ˆæ•°æ®ç»“æž„ã€ç¡¬ä»¶å¯„å˜å™¨ç‰ï¼‰å¿…须由é”ä¿æŠ¤ã€‚æ–° 的代ç 应该谨记这一è¦æ±‚;事åŽä¿®æ”¹é”æ˜¯ä¸€é¡¹ç›¸å½“å›°éš¾çš„ä»»åŠ¡ã€‚å†…æ ¸å¼€å‘人员应该花 时间充分了解å¯ç”¨çš„é”原è¯ï¼Œä»¥ä¾¿ä¸ºå·¥ä½œé€‰æ‹©æ£ç¡®çš„工具。对并å‘性缺ä¹å…³æ³¨çš„代ç 很难进入主线。 回归 **** 最åŽä¸€ä¸ªå€¼å¾—一æçš„å±é™©æ˜¯å›žå½’:它å¯èƒ½ä¼šå¼•èµ·å¯¼è‡´çŽ°æœ‰ç”¨æˆ·çš„æŸäº›ä¸œè¥¿ä¸æ–çš„æ”¹å˜ ï¼ˆè¿™ä¹Ÿå¯èƒ½ä¼šå¸¦æ¥å¾ˆå¤§çš„改进)。这ç§å˜åŒ–被称为“回归â€ï¼Œå›žå½’å·²ç»æˆä¸ºä¸»çº¿å†…æ ¸ 最ä¸å—欢迎的问题。除了少数例外情况,如果回归ä¸èƒ½åŠæ—¶ä¿®æ£ï¼Œä¼šå¯¼è‡´å›žå½’的修改 将被å–消。最好首先é¿å…回归å‘生。 人们常常争论,如果回归带æ¥çš„功能远超过产生的问题,那么回归是å¦ä¸ºå¯æŽ¥å—的。 å¦‚æžœå®ƒç ´å了一个系统å´ä¸ºå个系统带æ¥æ–°çš„功能,为何ä¸æ”¹æ”¹æ€åº¦å‘¢ï¼Ÿ2007å¹´7月, Linus对这个问题给出了最佳ç”案: :: 所以我们ä¸ä¼šé€šè¿‡å¼•å…¥æ–°é—®é¢˜æ¥ä¿®å¤é”™è¯¯ã€‚è¿™ç§æ–¹å¼æ˜¯é ä¸ä½çš„ï¼Œæ²¡äººçŸ¥é“ æ˜¯å¦çœŸçš„有进展。是å‰è¿›ä¸¤æ¥ã€åŽé€€ä¸€æ¥ï¼Œè¿˜æ˜¯å‰è¿›ä¸€æ¥ã€åŽé€€ä¸¤æ¥ï¼Ÿ (http://lwn.net/articles/243460/) 特别ä¸å—欢迎的一ç§å›žå½’类型是用户空间ABI的任何å˜åŒ–。一旦接å£è¢«å¯¼å‡ºåˆ°ç”¨æˆ·ç©ºé—´ï¼Œ å°±å¿…é¡»æ— é™æœŸåœ°æ”¯æŒå®ƒã€‚这一事实使得用户空间接å£çš„åˆ›å»ºç‰¹åˆ«å…·æœ‰æŒ‘æˆ˜æ€§ï¼šå› ä¸ºå®ƒä»¬ ä¸èƒ½ä»¥ä¸å…¼å®¹çš„æ–¹å¼è¿›è¡Œæ›´æ”¹ï¼Œæ‰€ä»¥å¿…é¡»ä¸€æ¬¡å°±å¯¹ã€‚å› æ¤ï¼Œç”¨æˆ·ç©ºé—´æŽ¥å£æ€»æ˜¯éœ€è¦å¤§é‡ çš„æ€è€ƒã€æ¸…晰的文档和广泛的审查。 代ç 检查工具 ------------ 至少目å‰ï¼Œç¼–å†™æ— é”™è¯¯ä»£ç ä»ç„¶æ˜¯æˆ‘们ä¸å¾ˆå°‘人能达到的ç†æƒ³çŠ¶æ€ã€‚ä¸è¿‡ï¼Œæˆ‘ä»¬å¸Œæœ›åš çš„æ˜¯ï¼Œåœ¨ä»£ç è¿›å…¥ä¸»çº¿å†…æ ¸ä¹‹å‰ï¼Œå°½å¯èƒ½å¤šåœ°æ•èŽ·å¹¶ä¿®å¤è¿™äº›é”™è¯¯ã€‚为æ¤ï¼Œå†…æ ¸å¼€å‘人 员已ç»æ供了一系列令人å°è±¡æ·±åˆ»çš„工具,å¯ä»¥è‡ªåŠ¨æ•èŽ·å„ç§å„æ ·çš„éšè—问题。计算机 å‘现的任何问题都是一个以åŽä¸ä¼šå›°æ‰°ç”¨æˆ·çš„é—®é¢˜ï¼Œå› æ¤ï¼Œåªè¦æœ‰å¯èƒ½ï¼Œå°±åº”该使用 自动化工具。 第一æ¥æ˜¯æ³¨æ„编译器产生的è¦å‘Šã€‚当å‰ç‰ˆæœ¬çš„GCCå¯ä»¥æ£€æµ‹ï¼ˆå¹¶è¦å‘Šï¼‰å¤§é‡æ½œåœ¨é”™è¯¯ã€‚ 通常,这些è¦å‘Šéƒ½æŒ‡å‘真æ£çš„问题。æ交以供审阅的代ç 一般ä¸ä¼šäº§ç”Ÿä»»ä½•ç¼–译器è¦å‘Šã€‚ 在消除è¦å‘Šæ—¶ï¼Œæ³¨æ„了解真æ£çš„åŽŸå› ï¼Œå¹¶å°½é‡é¿å…仅“修å¤â€ä½¿è¦å‘Šæ¶ˆå¤±è€Œä¸è§£å†³å…¶åŽŸå› 。 请注æ„,并éžæ‰€æœ‰ç¼–译器è¦å‘Šéƒ½é»˜è®¤å¯ç”¨ã€‚使用“make KCFLAGS=-Wâ€æž„å»ºå†…æ ¸ä»¥ 获得完整集åˆã€‚ å†…æ ¸æä¾›äº†å‡ ä¸ªé…置选项,å¯ä»¥æ‰“开调试功能;大多数é…置选项ä½äºŽâ€œkernel hacking†åèœå•ä¸ã€‚对于任何用于开å‘æˆ–æµ‹è¯•ç›®çš„çš„å†…æ ¸ï¼Œéƒ½åº”è¯¥å¯ç”¨å…¶ä¸å‡ 个选项。特别是, 您应该打开: - FRAME_WARN 获å–大于给定数é‡çš„å †æ ˆå¸§çš„è¦å‘Šã€‚ 这些è¦å‘Šç”Ÿæˆçš„输出å¯èƒ½æ¯”较冗长,但您ä¸å¿…担心æ¥è‡ªå†…æ ¸å…¶ä»–éƒ¨åˆ†çš„è¦å‘Šã€‚ - DEBUG_OBJECTS å°†æ·»åŠ ä»£ç ä»¥è·Ÿè¸ªå†…æ ¸åˆ›å»ºçš„å„ç§å¯¹è±¡çš„生命周期,并在出现问题 æ—¶å‘出è¦å‘Šã€‚å¦‚æžœä½ è¦æ·»åŠ 创建(和导出)关于其自己的å¤æ‚对象的å系统,请 考虑打开对象调试基础结构的支æŒã€‚ - DEBUG_SLAB å¯ä»¥å‘现å„ç§å†…å˜åˆ†é…和使用错误;它应该用于大多数开å‘å†…æ ¸ã€‚ - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP å’Œ DEBUG_MUTEXES 会å‘现许多常è§çš„ é”错误。 还有很多其他调试选项,其ä¸ä¸€äº›å°†åœ¨ä¸‹é¢è®¨è®ºã€‚å…¶ä¸ä¸€äº›æœ‰æ˜¾è‘—的性能影å“,ä¸åº” 一直使用。在å¦ä¹ å¯ç”¨é€‰é¡¹ä¸ŠèŠ±è´¹ä¸€äº›æ—¶é—´ï¼Œå¯èƒ½ä¼šåœ¨çŸæœŸå†…得到许多回报。 å…¶ä¸ä¸€ä¸ªè¾ƒé‡çš„调试工具是é”检查器或“lockdepâ€ã€‚该工具将跟踪系统ä¸æ¯ä¸ªé” (spinlock或mutex)的获å–和释放ã€èŽ·å–é”的相对顺åºã€å½“å‰ä¸æ–环境ç‰ç‰ã€‚然åŽï¼Œ 它å¯ä»¥ç¡®ä¿æ€»æ˜¯ä»¥ç›¸åŒçš„顺åºèŽ·å–é”,相åŒçš„ä¸æ–å‡è®¾é€‚用于所有情况ç‰ç‰ã€‚æ¢å¥è¯ 说,lockdepå¯ä»¥æ‰¾åˆ°è®¸å¤šå¯¼è‡´ç³»ç»Ÿæ»é”的场景。在部署的系统ä¸ï¼Œè¿™ç§é—®é¢˜å¯èƒ½ä¼š 很痛苦(对于开å‘人员和用户而言);LockDepå…许æå‰ä»¥è‡ªåŠ¨æ–¹å¼å‘现问题。具有 任何类型的éžæ™®é€šé”的代ç 在æ交åˆå¹¶å‰åº”在å¯ç”¨lockdep的情况下è¿è¡Œæµ‹è¯•ã€‚ ä½œä¸ºä¸€ä¸ªå‹¤å¥‹çš„å†…æ ¸ç¨‹åºå‘˜ï¼Œæ¯«æ— 疑问,您将检查任何å¯èƒ½å¤±è´¥çš„æ“作(如内å˜åˆ†é…) 的返回状æ€ã€‚然而,事实上,最终的故障å¤çŽ°è·¯å¾„å¯èƒ½å®Œå…¨æ²¡æœ‰ç»è¿‡æµ‹è¯•ã€‚未测试的 代ç 往往会出问题;如果所有这些错误处ç†è·¯å¾„éƒ½è¢«æ‰§è¡Œäº†å‡ æ¬¡ï¼Œé‚£ä¹ˆæ‚¨å¯èƒ½å¯¹ä»£ç 更有信心。 å†…æ ¸æ供了一个å¯ä»¥åšåˆ°è¿™ä¸€ç‚¹çš„错误注入框架,特别是在涉åŠå†…å˜åˆ†é…的情况下。 å¯ç”¨æ•…障注入åŽï¼Œå†…å˜åˆ†é…çš„å¯é…置失败的百分比;这些失败å¯ä»¥é™å®šåœ¨ç‰¹å®šçš„代ç 范围内。在å¯ç”¨äº†æ•…障注入的情况下è¿è¡Œï¼Œç¨‹åºå‘˜å¯ä»¥çœ‹åˆ°å½“情况æ¶åŒ–时代ç å¦‚ä½•å“ åº”ã€‚æœ‰å…³å¦‚ä½•ä½¿ç”¨æ¤å·¥å…·çš„详细信æ¯ï¼Œè¯·å‚阅 Documentation/fault-injection/fault-injection.rst。 “sparseâ€é™æ€åˆ†æžå·¥å…·å¯ä»¥å‘现其他类型的错误。sparseå¯ä»¥è¦å‘Šç¨‹åºå‘˜ç”¨æˆ·ç©ºé—´ å’Œå†…æ ¸ç©ºé—´åœ°å€ä¹‹é—´çš„æ··æ·†ã€å¤§ç«¯åºä¸Žå°ç«¯åºçš„æ··æ·†ã€åœ¨éœ€è¦ä¸€ç»„ä½æ ‡å¿—çš„åœ°æ–¹ä¼ é€’ 整数值ç‰ç‰ã€‚sparseå¿…é¡»å•ç‹¬å®‰è£…(如果您的分å‘æœåŠ¡å™¨æ²¡æœ‰å°†å…¶æ‰“包, å¯ä»¥åœ¨ https://sparse.wiki.kernel.org/index.php/Main_page 找到), 然åŽå¯ä»¥é€šè¿‡åœ¨make命令ä¸æ·»åŠ “C=1â€åœ¨ä»£ç 上è¿è¡Œå®ƒã€‚ “Coccinelleâ€å·¥å…· :ref:`http://coccinelle.lip6.fr/ <devtools_coccinelle>` 能够å‘现å„ç§æ½œåœ¨çš„ç¼–ç 问题;它还å¯ä»¥ä¸ºè¿™äº›é—®é¢˜æ出修å¤æ–¹æ¡ˆã€‚在 scripts/coccinelle目录下已ç»æ‰“åŒ…äº†ç›¸å½“å¤šçš„å†…æ ¸â€œè¯ä¹‰è¡¥ä¸â€ï¼›è¿è¡Œ “make coccicheckâ€å°†è¿è¡Œè¿™äº›è¯ä¹‰è¡¥ä¸å¹¶æŠ¥å‘Šå‘现的任何问题。有关详细信æ¯ï¼Œè¯·å‚阅 :ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>` 其他类型的å¯ç§»æ¤æ€§é”™è¯¯æœ€å¥½é€šè¿‡ä¸ºå…¶ä»–体系结构编译代ç æ¥å‘现。如果没有S/390系统 或Blackfinå¼€å‘æ¿ï¼Œæ‚¨ä»ç„¶å¯ä»¥æ‰§è¡Œç¼–译æ¥éª¤ã€‚å¯ä»¥åœ¨ä»¥ä¸‹ä½ç½®æ‰¾åˆ°ä¸€å¤§å †ç”¨äºŽx86系统的 交å‰ç¼–译器: https://www.kernel.org/pub/tools/crosstool/ 花一些时间安装和使用这些编译器将有助于é¿å…以åŽçš„尴尬。 文档 ---- æ–‡æ¡£é€šå¸¸æ¯”å†…æ ¸å¼€å‘规则更为例外。å³ä¾¿å¦‚æ¤ï¼Œè¶³å¤Ÿçš„文档将有助于简化将新代ç åˆå¹¶ åˆ°å†…æ ¸ä¸çš„过程,使其他开å‘人员的生活更轻æ¾ï¼Œå¹¶å¯¹æ‚¨çš„用户有所帮助。在许多情况 ä¸‹ï¼Œæ·»åŠ æ–‡æ¡£å·²åŸºæœ¬ä¸Šæ˜¯å¼ºåˆ¶æ€§çš„ã€‚ 任何补ä¸çš„第一个文档是其关è”çš„å˜æ›´æ—¥å¿—。日志æ¡ç›®åº”该æè¿°æ£åœ¨è§£å†³çš„问题ã€è§£å†³ 方案的形å¼ã€å¤„ç†è¡¥ä¸çš„人员ã€å¯¹æ€§èƒ½çš„任何相关影å“,以åŠç†è§£è¡¥ä¸å¯èƒ½éœ€è¦çš„任何 其他内容。确ä¿å˜æ›´æ—¥å¿—说明了*为什么*è¡¥ä¸å€¼å¾—应用;大é‡å¼€å‘者未能æ供这些信æ¯ã€‚ ä»»ä½•æ·»åŠ æ–°ç”¨æˆ·ç©ºé—´æŽ¥å£çš„代ç ——包括新的sysfs或/proc文件——都应该包å«è¯¥æŽ¥å£ 的文档,该文档使用户空间开å‘人员能够知é“他们在使用什么。请å‚阅 Documentation/ABI/README,了解如何æ¤æ–‡æ¡£æ ¼å¼ä»¥åŠéœ€è¦æ供哪些信æ¯ã€‚ 文档 :ref:`Documentation/admin-guide/kernel-parameters.rst <kernelparameters>` æè¿°äº†å†…æ ¸çš„æ‰€æœ‰å¼•å¯¼æ—¶é—´å‚æ•°ã€‚ä»»ä½•æ·»åŠ æ–°å‚æ•°çš„è¡¥ä¸éƒ½åº”该å‘è¯¥æ–‡æ¡£æ·»åŠ é€‚å½“çš„ æ¡ç›®ã€‚ 任何新的é…置选项都必须附有帮助文本,帮助文本需清楚地解释这些选项以åŠç”¨æˆ·å¯èƒ½ 希望何时使用它们。 许多å系统的内部APIä¿¡æ¯é€šè¿‡ä¸“é—¨æ ¼å¼åŒ–的注释进行记录;这些注释å¯ä»¥é€šè¿‡ “kernel-docâ€è„šæœ¬ä»¥å¤šç§æ–¹å¼æå–å’Œæ ¼å¼åŒ–。如果您在具有kerneldoc注释的åç³»ç»Ÿä¸ å·¥ä½œï¼Œåˆ™åº”è¯¥ç»´æŠ¤å®ƒä»¬ï¼Œå¹¶æ ¹æ®éœ€è¦ä¸ºå¤–部å¯ç”¨çš„åŠŸèƒ½æ·»åŠ å®ƒä»¬ã€‚å³ä½¿åœ¨æ²¡æœ‰å¦‚æ¤è®°å½• 的领域ä¸ï¼Œä¸ºå°†æ¥æ·»åŠ kerneldoc注释也没有å处;实际上,这对于刚开始开å‘å†…æ ¸çš„äºº æ¥è¯´æ˜¯ä¸€ä¸ªæœ‰ç”¨çš„æ´»åŠ¨ã€‚è¿™äº›æ³¨é‡Šçš„æ ¼å¼ä»¥åŠå¦‚何创建kerneldoc模æ¿çš„一些信æ¯å¯ä»¥åœ¨ :ref:`Documentation/doc-guide/ <doc_guide>` 上找到。 任何阅读大é‡çŽ°æœ‰å†…æ ¸ä»£ç 的人都会注æ„到,注释的缺失往往是最值得注æ„的。åŒæ—¶ï¼Œ 对新代ç çš„è¦æ±‚比过去更高;åˆå¹¶æœªæ³¨é‡Šçš„代ç å°†æ›´åŠ å›°éš¾ã€‚è¿™å°±æ˜¯è¯´ï¼Œäººä»¬å¹¶ä¸æœŸæœ› 详细注释的代ç 。代ç 本身应该是自解释的,注释é˜é‡Šäº†æ›´å¾®å¦™çš„æ–¹é¢ã€‚ æŸäº›äº‹æƒ…应该总是被注释。使用内å˜å±éšœæ—¶ï¼Œåº”附上一行文å—,解释为什么需è¦è®¾ç½®å†…å˜ å±éšœã€‚æ•°æ®ç»“æž„çš„é”规则通常需è¦åœ¨æŸä¸ªåœ°æ–¹è§£é‡Šã€‚一般æ¥è¯´ï¼Œä¸»è¦æ•°æ®ç»“构需è¦å…¨é¢ 的文档。应该指出代ç ä¸åˆ†ç«‹çš„ä½ä¹‹é—´ä¸æ˜Žæ˜¾çš„ä¾èµ–性。任何å¯èƒ½è¯±ä½¿ä»£ç 管ç†äººè¿›è¡Œ 错误的“清ç†â€çš„事情都需è¦ä¸€ä¸ªæ³¨é‡Šæ¥è¯´æ˜Žä¸ºä»€ä¹ˆè¦è¿™æ ·åšã€‚ç‰ç‰ã€‚ 内部API更改 ----------- å†…æ ¸æ供给用户空间的二进制接å£ä¸èƒ½è¢«ç ´å,除éžé€¼ä¸å¾—å·²ã€‚è€Œå†…æ ¸çš„å†…éƒ¨ç¼–ç¨‹æŽ¥å£ æ˜¯é«˜åº¦æµåŠ¨çš„,当需è¦æ—¶å¯ä»¥æ›´æ”¹ã€‚å¦‚æžœä½ å‘现自己ä¸å¾—ä¸å¤„ç†ä¸€ä¸ªå†…æ ¸API,或者仅 ä»…å› ä¸ºå®ƒä¸æ»¡è¶³ä½ çš„éœ€æ±‚å¯¼è‡´æ— æ³•ä½¿ç”¨ç‰¹å®šçš„åŠŸèƒ½ï¼Œè¿™å¯èƒ½æ˜¯API需è¦æ”¹å˜çš„ä¸€ä¸ªæ ‡å¿—ã€‚ ä½œä¸ºå†…æ ¸å¼€å‘人员,您有æƒè¿›è¡Œæ¤ç±»æ›´æ”¹ã€‚ çš„ç¡®å¯ä»¥è¿›è¡ŒAPI更改,但更改必须是åˆç†çš„ã€‚å› æ¤ä»»ä½•è¿›è¡Œå†…部API更改的补ä¸éƒ½åº”该 附带关于更改内容和必è¦åŽŸå› çš„æ述。这ç§å˜åŒ–也应该拆分æˆä¸€ä¸ªå•ç‹¬çš„è¡¥ä¸ï¼Œè€Œä¸æ˜¯ 埋在一个更大的补ä¸ä¸ã€‚ å¦ä¸€ä¸ªè¦ç‚¹æ˜¯ï¼Œæ›´æ”¹å†…部APIçš„å¼€å‘人员通常è¦è´Ÿè´£ä¿®å¤å†…æ ¸æ ‘ä¸è¢«æ›´æ”¹ç ´å的任何代ç 。 对于一个广泛使用的函数,这个责任å¯ä»¥å¯¼è‡´æˆç™¾ä¸Šåƒçš„å˜åŒ–,其ä¸è®¸å¤šå˜åŒ–å¯èƒ½ä¸Žå…¶ä»– å¼€å‘人员æ£åœ¨åšçš„工作相冲çªã€‚ä¸ç”¨è¯´ï¼Œè¿™å¯èƒ½æ˜¯ä¸€é¡¹å¤§å·¥ç¨‹ï¼Œæ‰€ä»¥æœ€å¥½ç¡®ä¿ç†ç”±æ˜¯ å¯é 的。请注æ„,coccinelle工具å¯ä»¥å¸®åŠ©è¿›è¡Œå¹¿æ³›çš„API更改。 在进行ä¸å…¼å®¹çš„API更改时,应尽å¯èƒ½ç¡®ä¿ç¼–译器æ•èŽ·æœªæ›´æ–°çš„代ç 。这将帮助您确ä¿æ‰¾ 到该接å£çš„æ ‘å†…ç”¨å¤„ã€‚å®ƒè¿˜å°†è¦å‘Šå¼€å‘äººå‘˜æ ‘å¤–ä»£ç å˜åœ¨ä»–们需è¦å“应的更改。支æŒæ ‘外 代ç ä¸æ˜¯å†…æ ¸å¼€å‘人员需è¦æ‹…心的事情,但是我们也ä¸å¿…ä½¿æ ‘å¤–å¼€å‘人员的生活有ä¸å¿…è¦ çš„å›°éš¾ã€‚