Visual Studio Code是閱讀代碼的不二選擇,尤其是與傳統IDE工程並駕齊驅的、由構建器(Make、Ninja、CMake等)組織的工程,只需打開一個文件夾作爲工作區,即可立刻開始。而VS Code對C語言的多方面支持,使得用它來閱讀、學習、調試C語言源代碼,尤有一種舒心簡便的體驗。
——所以,對於學習Linux Android內核源碼的程序員,我首先推薦VS Code。只需簡單的配置,就可以將VS Code打造成貼心的Linux代碼閱讀工具。
第一步:安裝C語言相關擴展
VS Code默認未提供對C語言的完整支持[1],因此需要先安裝相應的擴展。
在擴展管理器中安裝以下擴展:
擴展名稱 | 介紹 |
---|---|
C/C++ | 微軟推出的C/C++擴展,可以將VS Code打造成C/C++的IDE |
C++ Intellisense | austin 推出的智能提示(Intellisense)擴展,可以在用戶鍵入代碼時給出自動完成提示 |
安裝完成後,在擴展管理器中選擇“重新加載”(Reload),重載VS Code窗口,使擴展生效。
第二步:配置“C/C++”擴展
打開Linux源碼目錄,可以打開源碼的根目錄,也可以打開其中任意一個模塊的子目錄(如SELinux模塊的子目錄security/selinux
),由此開始對源碼的管理。
不過這個時候,由於配置文件未設置好,與代碼提示有關的功能還不能使用,這會大大降低我們的體驗。實際體驗中,代碼提示體現在如下功能特性:
特性 | 說明 |
---|---|
懸停提示 | 在鼠標懸停時,自動顯示懸停處對象的定義 不需搜索文本即可快速瞭解一個對象的定義和使用方法 |
自動完成 | 鍵入代碼時,給出自動完成提示,即相關備選項的菜單 |
上下文定位 | 按住Ctrl 鍵,單擊對象名,即可跳轉到它的定義處 |
上下文查看 | 可以跳轉到對象的由來【聲明(declaration)或定義(definition)】所在的地方; 並提供速覽(peek)——在當前代碼窗口中分裂出一塊小區域顯示它的由來 |
代碼提示工作的基礎是對源碼包含(#include
)的頭文件進行分析,分析其中的各種定義,其次才分析上下文。默認情況下,C/C++擴展只會查找工作目錄下的所有頭文件,然而Linux的源碼還會用到其他的頭文件。爲此需要配置這個擴展。
一般涉及的頭文件都在內核源碼裏的如下子目錄中,自低向高分層次列舉如下。注意在上層的頭文件會調用下層的頭文件,如此形成依賴關係:
層級 | 頭文件包含目錄 | 說明 |
---|---|---|
1 | arch/arm/mach-<機器方案名>/include |
由機器方案廠商提供的專用於某一系列設備的程序源碼 |
2 | arch/arm/include |
架構的頭文件,包含的文件以用於彙編爲主 |
3 | include |
內核的主要頭文件 |
以上針對ARM架構介紹,其他架構(如X86、MIPS)類推即可。機器方案名根據設備配置文件來確定。
接下來就編輯配置文件,把上述相應的目錄加入進來。按Ctrl+Alt+P
打開命令面板,輸入Edit configurations
,在其中選擇C/Cpp: Edit configurations
,進入配置文件編輯。配置文件的格式是JSON,如下所示:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
其中的configurations.includePath
就是代碼分析時包含頭文件的目錄。該數組的值支持一個宏${workspaceFolder}
,指代工作區所在的路徑,由此在填入值的時候,允許根據以上頭文件夾與它的相對位置來填寫。當然也可以填寫絕對路徑,不過絕對路徑的健壯性(robust)不夠強。
填寫時要嚴格遵循順序,下層在前,上層在後,否則不能確保有依賴關係的頭文件均能被找出來。
舉例來說,假如工作區在內核源碼下security/selinux
目錄裏,那麼應該這樣填寫:
{
"......"
"includePath": [
"${workspaceFolder}/../../arch/arm/mach-<機器方案名>/include/**",
"${workspaceFolder}/../../arch/arm/include/**",
"${workspaceFolder}/../../include/**",
"${workspaceFolder}/**"
],
"......"
}
設置之後,再次打開源代碼,即可發現以上提到的特性均能一一實現了。
-
VS Code只對JavaScript、TypeScript等開發它的語言提供了原生支持。 ↩