如何使用VScode Debug Kernel
1. 首先安裝Linux-lab
安裝地址及方法:Linux-lab
2. VMware Ubuntu 環境準備
- 安裝VScode插件:
Native Debug
,C/C++
等相關插件,其他插件根據自己需要再添加 - VMware中的host(Ubuntu 18.04)相關環境配置:
$ sudo mkdir -p /labs/linux-lab
$ sudo ln -s /home/book/workspace/project/docker/cloud-lab/labs/linux-lab/linux-stable/labs/linux-lab/linux-stable # 注意要用絕對路徑
這一步做軟鏈接是因爲在linux-lab中我們的根目錄是/labs/linux-lab,vmlinux的符號也是使用的這個路徑,否則會提示找不到該文件
3. Linux-lab 環境準備
- 設置交叉編譯工具:
$ vim boards/aarch64/virt/Makefile
$ # 將 CCORI ?= internal 這一行修改爲你本地已有的編譯工具
$ # 查看本地已有的工具鏈
$ make toolchain-list
Listing prebuilt toolchain ...
[ internal gcc-4.9.3 ]:
Remote.:
Local..: /usr/local/bin/
Tool...: aarch64-linux-gnu-gcc
Version: aarch64-linux-gnu-gcc (Linaro GCC 4.9-2015.05) 4.9.3 20150413 (prerelease)
More...: /usr/bin/aarch64-linux-gnu-gcc-4.8 /usr/bin/aarch64-linux-gnu-gcc-4.9.3
[ bootlin 2018.11-1 ]:
Remote.: https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2018.11-1.tar.bz2
Local..: /labs/linux-lab/prebuilt/toolchains/aarch64/aarch64--uclibc--stable-2018.11-1/bin
Tool...: aarch64-linux-gcc
Version: Not downloaded, please download it: make toolchain CCORI=bootlin
[ linaro 7.4.1-2019.02 ]:
Remote.: https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
Local..: /labs/linux-lab/prebuilt/toolchains/aarch64/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin
Tool...: aarch64-linux-gnu-gcc
Version: Not downloaded, please download it: make toolchain CCORI=linaro
[ arm 8.3-2019.03 ]:
Remote.: https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
Local..: /labs/linux-lab/prebuilt/toolchains/aarch64/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
Tool...: aarch64-linux-gnu-gcc
Version: aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0
[ buildroot ]:
Remote.:
Local..: /labs/linux-lab/output/aarch64/buildroot-2019.11-virt/host/usr/bin
Tool...: aarch64-linux-gcc
Version: aarch64-linux-gcc.br_real (Buildroot 2019.11-dirty) 8.3.0
可以看到local
有哪些可使用的工具鏈,如果沒有請訪問Remote
下載到該目錄即可,因此我將internal
可以改爲arm
。
- 編譯arm64/virt:
$ make BOARD=aarch64/virt
$ make feature f=debug
$ make kernel-olddefconfig
$ make kernel
$ make debug
# LOG: Please run this in another terminal:
#
# env PATH=/usr/local/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin aarch64-linux-gnu-gdb /labs/linux-lab/output/aarch64/linux-v5.5-virt/vmlinux
此時打開VScode,文件->將文件夾添加到工作區->linux-lab
將整個文件夾都添加到VScode中。
- 配置
Native Debug
插件中的luanch.json
,我的配置如下:
{
// 使用 IntelliSense 瞭解相關屬性。
// 懸停以查看現有屬性的描述。
// 欲瞭解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
{
"name": "Debug",
"type": "gdb",
"request": "launch",
"env": null,
"gdbpath": "/home/book/workspace/project/docker/cloud-lab/labs/linux-lab/prebuilt/toolchains/aarch64/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb",
"target": "${workspaceRoot}/prebuilt/toolchains/aarch64/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb",
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText"
}
]
}
其中VScode中的launch.json
位置如下:
gdbpath
設置爲上面local
的路徑,保證編譯和debug工具版本一致
- 啓動調試:點擊VScode上方的
運行(R)->啓動調試(S)
,然後會出現如下調試圖標
接下來會彈出調試窗口,我們需要輸入如下命令:
$ # Linux-lab 的IP地址
$ target remote 172.17.0.3:1234
$ # 加載vmlinux
$ file /home/book/workspace/project/docker/cloud-lab/labs/linux-lab/output/aarch64/linux-v5.5-virt/vmlinux
- 調試控制檯的啓動日誌如下:
target remote 172.17.0.3:1234
Remote debugging using 172.17.0.3:1234
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x0000000040000000 in ?? ()
Not implemented stop reason (assuming exception): undefined
file /home/book/workspace/project/docker/cloud-lab/labs/linux-lab/output/aarch64/linux-v5.5-virt/vmlinux
A program is being debugged already.
Are you sure you want to change the file?
(y or n) [answered Y; input not from terminal]
Load new symbol table from "/home/book/workspace/project/docker/cloud-lab/labs/linux-lab/output/aarch64/linux-v5.5-virt/vmlinux"? (y or n) [answered Y; input not from terminal]
Reading symbols from /home/book/workspace/project/docker/cloud-lab/labs/linux-lab/output/aarch64/linux-v5.5-virt/vmlinux...
done.
4.開始調試
- 調試控制檯設置斷點:
$ b start_kernel
b start_kernel
Breakpoint 5 at 0xffffffc010a20c04: file /labs/linux-lab/linux-stable/init/main.c, line 577.
$ c
c
Continuing.
Thread 1 hit Breakpoint 5, start_kernel () at /labs/linux-lab/linux-stable/init/main.c:577
577 {
- 運行:
5.關於編譯器優化
運行過程中可能會存在亂序運行問題,這是因爲編譯器優化的原因:
- 可以參考 Linux下如何繞過編譯器優化