如何使用VScode DebugKernel

如何使用VScode Debug Kernel

作者:[email protected]

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.關於編譯器優化

運行過程中可能會存在亂序運行問題,這是因爲編譯器優化的原因:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章