原文链接:https://blog.csdn.net/u010252464/article/details/116332878

概述

在见识到source insight在追踪内核代码方面的强大能力后,习惯使用vscode的我顿时对source insight产生了兴趣,但随后我就发现自己还是不习惯使用source insight,于是折腾起vscode来,看看能不能借助vscode的各种插件来实现强大如source insight那样的内核代码追踪功能。
在网上查找时,发现很多人使用vscode+GNU Global的方案,但试过后发现并不好用,经常提示找不到符号的定义。最后发现一款插件能基本满足我的要求,它的功能虽然比source insight差一些,但支持跳转到定义、代码补全和鼠标悬停显示符号定义这些功能。另外,虽然这款插件和GNU Global一样都要在工程目录下生成文件以供追踪使用,但它生成文件速度也要比GNU Global快。下面是这款插件的基本介绍:

插件名称:Embeded Linux Kernel Dev(简称ELKD)

插件依赖:
软件——universal-ctags
vscode插件——DeviceTree
插件效果(跳转到定义):光标停在符号的位置,然后右击鼠标选择“转到定义”或者按F12,即可查看符号的定义或者直接跳到符号定义的所在文件中。
在这里插入图片描述

插件的安装配置

安装universal-ctags

参考链接:安装ctags方法

安装vscode插件DeviceTree

这个在vscode扩展市场里一搜就有, 此处就不赘述。

安装vscode插件Embeded Linux Kernel Dev
这个也是在vsocde扩展市场里一搜就有,此处也不赘述了。

配置

使用vscode打开内核源码目录,打开任意一个.c文件后,ELKD就会开始生成ctag 索引(显示在vscode的左下角,如下图):
在这里插入图片描述
过了会儿(具体看电脑性能),ctag 索引就会建立完毕。此时可以在源码目录下看到一个名为.vscode-ctags的文件。
在这里插入图片描述
接下来,我们就可以追踪内核代码,查看符号所在文件及其定义了。
更多详细内容,可在vscode中查看ELKD的说明。

VScode 内核源码阅读与修改设置

https://blog.csdn.net/p1279030826/article/details/107464336?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

1、隐藏多余的文件
.vscode/settings.json 修改如下:

{
    "search.exclude": {
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.o":true,
        "**/*.su":true, 
        "**/*.cmd":true,
        "Documentation":true, 
 
        /* 屏蔽不用的架构相关的文件 */
        "arch/alpha":true,
        "arch/arc":true,
        "arch/arm64":true,
        "arch/avr32":true,
        "arch/[b-z]*":true,
        "arch/arm/plat*":true,   
        "arch/arm/mach-[a-h]*":true,   
        "arch/arm/mach-[n-z]*":true,  
        "arch/arm/mach-i[n-z]*":true, 
        "arch/arm/mach-m[e-v]*":true, 
        "arch/arm/mach-k*":true, 
        "arch/arm/mach-l*":true, 
 
        /* 屏蔽排除不用的配置文件 */
        "arch/arm/configs/[a-h]*":true, 
        "arch/arm/configs/[j-z]*":true, 
        "arch/arm/configs/imo*":true, 
        "arch/arm/configs/in*":true, 
        "arch/arm/configs/io*":true, 
        "arch/arm/configs/ix*":true, 
 
        /* 屏蔽掉不用的DTB文件 */
        "arch/arm/boot/dts/[a-h]*":true, 
        "arch/arm/boot/dts/[k-z]*":true, 
        "arch/arm/boot/dts/in*":true, 
        "arch/arm/boot/dts/imx1*":true, 
        "arch/arm/boot/dts/imx7*":true, 
        "arch/arm/boot/dts/imx2*":true, 
        "arch/arm/boot/dts/imx3*":true, 
        "arch/arm/boot/dts/imx5*":true, 
        "arch/arm/boot/dts/imx6d*":true, 
        "arch/arm/boot/dts/imx6q*":true, 
        "arch/arm/boot/dts/imx6s*":true, 
        "arch/arm/boot/dts/imx6ull-9x9*":true, 
        "arch/arm/boot/dts/imx6ull-14x14-ddr*":true, 
        "arch/arm/boot/dts/*.tmp":true,       
    },
    "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,  
        "**/*.o":true,
        "**/*.su":true, 
        "**/*.cmd":true,
        "Documentation":true, 
 
        /* 屏蔽不用的架构相关的文件 */
        "arch/alpha":true,
        "arch/arc":true,
        "arch/arm64":true,
        "arch/avr32":true,
        "arch/[b-z]*":true,
        "arch/arm/plat*":true,   
        "arch/arm/mach-[a-h]*":true,   
        "arch/arm/mach-[n-z]*":true,  
        "arch/arm/mach-i[n-z]*":true, 
        "arch/arm/mach-m[e-v]*":true, 
        "arch/arm/mach-k*":true, 
        "arch/arm/mach-l*":true, 
 
        /* 屏蔽排除不用的配置文件 */
        "arch/arm/configs/[a-h]*":true, 
        "arch/arm/configs/[j-z]*":true, 
        "arch/arm/configs/imo*":true, 
        "arch/arm/configs/in*":true, 
        "arch/arm/configs/io*":true, 
        "arch/arm/configs/ix*":true, 
 
        /* 屏蔽掉不用的DTB文件 */
        "arch/arm/boot/dts/[a-h]*":true, 
        "arch/arm/boot/dts/[k-z]*":true, 
        "arch/arm/boot/dts/in*":true, 
        "arch/arm/boot/dts/imx1*":true, 
        "arch/arm/boot/dts/imx7*":true, 
        "arch/arm/boot/dts/imx2*":true, 
        "arch/arm/boot/dts/imx3*":true, 
        "arch/arm/boot/dts/imx5*":true, 
        "arch/arm/boot/dts/imx6d*":true, 
        "arch/arm/boot/dts/imx6q*":true, 
        "arch/arm/boot/dts/imx6s*":true, 
        "arch/arm/boot/dts/imx6ull-9x9*":true, 
        "arch/arm/boot/dts/imx6ull-14x14-ddr*":true, 
        "arch/arm/boot/dts/*.tmp":true, 
    }
}

Ubuntu16.04安装配置和使用ctags

https://www.cnblogs.com/zjutzz/p/9393397.html

ctags可以用于在vim中的函数定义跳转。在ubuntu16.04下默认提供的ctags是很老很旧的ctags,快要发霉的版本(5.9~svn20110310-11),快扔掉它,安装universal-ctags吧!

安装新鲜的universal-ctags

universal-ctags是什么?A maintained ctags implementation, https://ctags.io,一个负责的ctags实现,在github上开源并且持续更新和维护。

不多说,快点安装吧:

sudo apt install autoconf
cd /tmp
git clone https://github.com/universal-ctags/ctags
cd ctags
./autogen.sh
./configure --prefix=/opt/software/universal-ctags  # 我的安装路径。你按自己的情况调整。
make -j8
sudo make install

把ctags可执行文件更新到系统PATH上?No,我选择创建链接的方式:

# 如果你装了emacs-snapshot,那么现在的ctags命令实际上链接到了/usr/bin/ctags-snapshot,要先删除链接文件:
# sudo rm /usr/bin/ctags
 
# 然后,把新编译安装的universal-ctags链接过来:
sudo ln -s /opt/software/universal-ctags/bin/ctags /usr/bin/ctags
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐