[Kernel-BBB] 2. kgdbwait và gdb server
Bài này mình sẽ dùng kgdbwait để ta có thể debug được kernel sớm hơn (Chưa sớm bằng qua JTAG) cũng như setup gdb server để dùng extensions của VS Code luôn :vv
1. Cấu hình kernel command line
1.1 Tìm hướng đi
Ở bài trước, mình đã cố sửa boot command qua u-boot, nhưng thực tế thì
1
2
=> printenv bootargs
## Error: "bootargs" not defined
Và mình kiểm tra thêm
1
2
=> printenv bootcmd
bootcmd=run findfdt; run init_console; run finduuid; run distro_bootcmd
**distro_bootcmd** nghĩa là U-Boot dùng distro boot — bootargs được build từ extlinux.conf trên boot partition, không phải từ env variables.
Ta có 2 cách,
1 là các bạn tháo thẻ nhớ ra và sửa trực tiếp file /boot/extlinux/extlinux.conf
2 là ta sửa qua local.conf.
Mình làm yocto mà nên là mình sẽ sửa qua local.conf. Còn bạn nào thắc mắc vậy bootcmd này trong source code đang set ở đâu thì nó ở đây
1.2 Sửa kernel command linux qua local.conf
Ta đơn giản thêm dòng sau vào local.conf
1
UBOOT_EXTLINUX_KERNEL_ARGS:append = " kgdboc=ttyS0,115200 kgdbwait"
Giờ build lại core-image-minimal rồi check output tại recipe-sysroot của core-image-minimal rồi thấy
Ta đã thấy kgdbboc và kgdbwait đã được thêm
2. Thử kgdbwait
Ta boot board lên và bạn sẽ thấy dòng log sau
1
2
[ 4.514801] KGDB: Registered I/O driver kgdboc
[ 4.533500] KGDB: Waiting for connection from remote gdb...
Vậy là đã thành công, giờ ta tiến đến Mở gdb ở máy pc
1
zk47@ltu:~$ sudo gdb-multiarch ~/Youtube/Yocto/yocto-bbb/poky/build-bbb/tmp/work/beaglebone-poky-linux-gnueabi/linux-bb.org/6.12.34+git/build/vmlinux
À ta nhớ tắt serial UART ở terminal khác đi nhé, rồi ta setup và connect y hệt bài trước
1
2
3
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
Remote debugging using /dev/ttyUSB0
kgdbwait sẽ giúp ta debug trước khi đến login Rất hữu ích khi
- Debug driver probe bị crash (I2C, SPI, MMC, USB, …)
- Debug filesystem mount lỗi
- Debug module loading có bug
- Debug kernel panic lúc boot trước khi lên tới login
- Board không boot được đến userspace → không thể
echo g
3. Setup launch.json cho VS Code Stdudio
3.1 Setup launch.json và thử bật debug
Thực tế mình đã setup 1 lần khá tương tự trong Yocto-BBB 18 các bạn có thể tham khảo trước nhé
Ta mở workdir linux-bb.org lên và tạo launch.json
launch.json nội dung như sau
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"version": "0.2.0",
"configurations": [
{
"name": "KGDB Kernel Debug (BBB)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/vmlinux",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb-multiarch",
"miDebuggerServerAddress": "/dev/ttyUSB0",
"miDebuggerArgs": "-b 115200",
"setupCommands": [
{
"description": "Map kernel source paths",
"text": "set substitute-path /usr/src/kernel /home/zk47/Youtube/Yocto/yocto-bbb/poky/build-bbb/tmp/work-shared/beaglebone/kernel-source",
"ignoreFailures": false
},
{
"description": "Enable pretty-printing",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
Tương tự các bạn lưu ý mấy trường như
- miDebuggerPath
- miDebuggerServerAddress
- miDebuggerArgs
- setupCommands
Sau đó bấm debug và ta sẽ được giao diện debug, tuy nhiên kernel sẽ running mà ko bấm dừng được vì ta không đặt breakpoint
Nếu các bạn truy cập được vào terminal của BBB thì các bạn sẽ chạy lệnh sau để dừng kernel
1
echo g > /proc/sysrq-trigger
Tuy nhiên khi dừng, nó sẽ bắn về 1 tín hiệu phản hồi cho GDB server, nếu KGDB bên VS code không bắt đươc thì nó sẽ cứ running như ảnh trên.
3.1 Trick để vào được debug
Như mình nói ở trên, nếu timing không khớp thì GDB VS code sẽ không kết nối được mà bị timeout
Do đó ta dùng 1 trick là hẹn giờ cho việc bật debug rồi thoát khỏi serial terminal
Các bạn tắt debug bên VS code này, bật serial terminal lên
1
root@beaglebone:~# (sleep 10; echo g > /proc/sysrq-trigger) &
Vậy là sau 10s nó mới gửi lệnh để tạm dừng kernel
Giờ bên VS code các bạn đợi 10s rồi mở lại debug
Mặc dù kết nối vào được, nhưng ta thấy kernel rồi lại vẫn chạy tiếp ? Bởi vì ta vốn dĩ không đặt breakpoint, nhưng đặt đâu cho chắc chắn kernel sẽ nhảy vào.
Các bạn nhìn board bây giờ, thì thấy đèn nháy đúng không ? Vậy ta đặt vào hàm blinkled chứ còn gì nữa.
Và thế là dừng được rồi, ta có thể debug có giao diện khá hay ho nhỉ :vv
Chúc các bạn thực hành thành công !!
P/s: Tuy nhiên đây vẫn chưa phải debug kernel từ dòng đầu tiên, nên chắc mình sẽ cần nghiên cứu thêm





