1、背景介紹
上一篇文章:VScode 結(jié)合Global構(gòu)建linux源代碼閱讀環(huán)境 ,介紹了在VS Code工具中通過(guò)remote-ssh遠(yuǎn)程登陸到Linux遠(yuǎn)程服務(wù)器,使用Global構(gòu)建linux源代碼閱讀環(huán)境,對(duì)linux kernel代碼進(jìn)行解析,實(shí)現(xiàn)全局搜索、自動(dòng)跳轉(zhuǎn)、代碼補(bǔ)全等功能,但是Global工具在建立代碼索引數(shù)據(jù)時(shí),將整個(gè)Linux源代碼都進(jìn)行了數(shù)據(jù)檢索分析,這樣會(huì)有很多重復(fù)的定義和聲明,不夠智能,不夠方便,接下來(lái)介紹使用vscode + clangd工具來(lái)解決此問(wèn)題。
2、原理介紹
clangd 可以實(shí)現(xiàn)代碼語(yǔ)義分析、代碼補(bǔ)全、跳轉(zhuǎn)等,能做到代碼精準(zhǔn)跳轉(zhuǎn)、精準(zhǔn)自動(dòng)補(bǔ)全;其原理是通過(guò)讀取工程編譯自動(dòng)生成的compile_commands.json 文件來(lái)索引其中包含的源文件和關(guān)聯(lián)的頭文件,因此能避免索引非編譯的代碼造成解析時(shí)語(yǔ)義混亂。compile_commands.json 文件是每個(gè)源文件的編譯參數(shù)、路徑等信息組成的一個(gè)json文件,clangd 通過(guò)這個(gè)文件可以準(zhǔn)確定位源文件需要引用的頭文件從而準(zhǔn)確的找到各種宏定義、函數(shù)、變量聲明的準(zhǔn)確值。
Linux源代碼已包含可以直接生成compile_commands.json文件的python腳本,在編譯后Linux kernel代碼路徑下執(zhí)行如下命令即可生成compile_commands.json文件:
python3 ./scripts/clang-tools/gen_compile_commands.py
3、安裝插件
打開VS Code,在擴(kuò)展界面搜索clangd后安裝插件:

安裝好插件后,使用VS Code打開任意C語(yǔ)言會(huì)提示你安裝clangd程序,由于我是用remote-ssh登陸到遠(yuǎn)程linux服務(wù)器上的,所有clangd程序會(huì)安裝到遠(yuǎn)程的服務(wù)器上,如果自動(dòng)安裝失敗,也可以在遠(yuǎn)程服務(wù)器上使用命令安裝(ubuntu服務(wù)器):
$ sudo apt install clangd

需要注意的是 clangd插件與C/C++ Intellisense、C/C++ GNU Global是沖突的,需要禁用或者卸載。
4、環(huán)境配置
前面的文章有提到在VS code 下如何進(jìn)行配置,和前面一樣clangd的配置我們同樣配置到遠(yuǎn)程用戶 setting.json文件中,在setting.json文件中新增如下配置:
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}",
"--background-index",
"--completion-style=detailed",
"--header-insertion=never",
"--log=verbose"
],
完成配置后,打開任意源代碼文件觸發(fā)clangd進(jìn)行解析:

clangd 檢索的數(shù)據(jù)庫(kù)位于工作目錄 .cache/clangd 文件夾,如果想重新生成檢索只要?jiǎng)h除相關(guān)的文件即可。如果一切正常,就看實(shí)現(xiàn)代碼跳轉(zhuǎn)了,但是一般都會(huì)出現(xiàn)問(wèn)題:

如上圖所示,出現(xiàn)了 Unknown argument: '-fno-allow-store-data-races' 等錯(cuò)誤。
解決方案:在工作目錄新建 .clangd 文件,輸入如下內(nèi)容(同類型的錯(cuò)誤都可以使用此方案解決)
CompileFlags:
Remove: [-fno-allow-store-data-races,-fconserve-stack]
clangd解析過(guò)程會(huì)輸出相應(yīng)的日志信息,可以根據(jù)輸出信息進(jìn)行問(wèn)題的排查:

上圖最核心的錯(cuò)誤提示:unkown target ABI 'lp64',在 .clangd 文件添加:-mabi=lp64
CompileFlags:
Remove: [-fno-allow-store-data-races,-fconserve-stack,-mabi=lp64]
解決相關(guān)的錯(cuò)誤問(wèn)題后,重新打開VS code,clangd會(huì)觸發(fā)重新檢索源代碼,檢索完成后即可使用clangd來(lái)檢索代碼:

5、閱讀代碼
clangd index 完成后,打開任意代碼文件,選擇相關(guān)函數(shù)或者變量,使用快捷鍵: CTRL+鼠標(biāo)左鍵(或者F12),實(shí)現(xiàn)函數(shù)定義的跳轉(zhuǎn)查詢,跳轉(zhuǎn)以后使用快捷鍵:ALT+左鍵頭 返回;當(dāng)然也具備對(duì)函數(shù)進(jìn)行自動(dòng)提示、補(bǔ)全的功能:

這樣就可以對(duì)linux kernel 代碼進(jìn)行愉快的探索了................
6、后記
根據(jù)前面一系列的文章,已介紹使用VS Code 遠(yuǎn)程登陸到服務(wù)器,對(duì)Linux kernel代碼建立索引,實(shí)現(xiàn)全局搜索、自動(dòng)跳轉(zhuǎn)、代碼補(bǔ)全等功能,愉快的閱讀Linux kernel源代碼了,下一步將介紹如何在VS code 中實(shí)現(xiàn)gdb可視化調(diào)試linux kernel源代碼。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-415444.html
VS code 可視化調(diào)試Linux kernel內(nèi)核文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415444.html
到了這里,關(guān)于VScode 結(jié)合clangd 構(gòu)建linux源代碼閱讀環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!