6.828 lab1 的 qemu,如何用 vscode 的 gdb 插件调试

215 天前
 amiwrong123

一些说明:

但我想用 vscode 的 gdb 插件来调试,就需要去编写 launch.json 文件。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "xv6",
            "type": "cppdbg",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "program": "${workspaceFolder}/obj/kern/kernel",
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "miDebuggerServerAddress": "localhost:26000",
            "stopAtEntry": true,
            "targetArchitecture": "x86_64",
            "setupCommands": [
                {
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

我是这么配置的,但是点击那个三角形后,就直接提示我“The program '/home/liu/6.828/lab/obj/kern/kernel' has exited with code 0 (0x00000000).”。我到底是哪里配置不对啊?

PS:搞了半天没有搞定,求各位大佬解答,感谢!

1149 次点击
所在节点    程序员
6 条回复
MrMissBlack
213 天前
编译应该没问题,我看 Makefile 中加了生成符号信息的选项。

而且 si 没有信息不代表符号没有读取成功,有些地址的代码是运行的时候写进去的,你应该看函数断点能不能设,能不能断下来。
amiwrong123
213 天前
@MrMissBlack #1
![]( https://s3.bmp.ovh/imgs/2024/05/26/182008722285f021.png)

试了一下,打断点是可以的。b bootmain 这样打断点也是可以 的了。
amiwrong123
213 天前
@MrMissBlack #1
符号信息 肯定是生成了的。目前实验的结果:
1. 另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以的。
2. 另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(昨天不知道为啥不行,但是今天你一说我一试,然后都好了。我两个符号文件 obj/boot/boot.out obj/kern/kernel 都试了,都是可以的了。而且都试了 直接打断点在代码地址、函数名称 都是可以的了)
3. 唯独这个 vscode 的 gdb ,我是没有弄好。刚才试了一下,还是不行。哎
amiwrong123
213 天前
@MrMissBlack #1
哈哈,老哥,vscode 我好像也搞定了。

我把 vscode 的 gdb 插件的 log 全部打开,发现有一些报错信息:
1: (307) ->&"/home/liu/6.828/lab/.gdbinit:33: Error in sourced command file:\n"
1: (307) ->&"obj/boot/boot.out: No such file or directory.\n"
1: (307) ->(gdb)
1: (308) ->1001^done,threads=[{id="1",target-id="Thread 1",details="CPU#0 [running]",frame={level="0",addr="0x0000fff0",func="??",args=[],arch="i8086"},state="stopped"}]

总结,它去读了 lab 文件夹下的.gdbinit ,这个文件只能在 gdb 命令加了-n -x .gdbinit 参数后(也就是 make gdb 的做法),才能去读取的。

但是不知道为什么,vscode 的 gdb 插件开始的时候,也会去读取这个.gdbinit 文件,明明我在 launch.json 里没有加-n -x .gdbinit 参数的啊?

我通过删掉.gdbinit 文件后,vscode 就好了。。我现在需要解决的是,如何改 launch.json ,让 vscode 的 gdb 不去自动读这个文件。
MrMissBlack
213 天前
@amiwrong123 #4 哈哈,搞好就可以了。三种方法,第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的,最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands
amiwrong123
213 天前
@MrMissBlack #5
“第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的”
嗯嗯,你说的这种方法肯定是可以的。

不过感觉是 VSCode 的 gdb 没有处理好 这个相对路径问题,毕竟直接使用 gdb 命令,都是可以正常读取 gdbinit 文件的这个相对路径 obj/boot/boot.out 的。

感觉就像是 VSCode 的 gdb 没有先 cd 到${workspaceFolder}再执行一样,估计还有什么参数我没设置。

“最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands”
是的,这个我自己加好了:
{
"text": "symbol-file ${workspaceFolder}/obj/boot/boot.out",
"ignoreFailures": true
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1043857

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX