一些说明:
但我想用 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:搞了半天没有搞定,求各位大佬解答,感谢!
有点新发现,第一个终端,会因为我vscode开始debug后,打印出新的log。
所以,我的vscode的debug应该是发挥作用了的,只是感觉好像是断点没有打上,所以导致整个内核直接运行到末尾了。但我已经在好几个打了断点了啊。哎,还是好奇怪。
纠正一下,“用终端先 make qemu-nox-gdb,另一个终端手动进 gdb ,然后再手动设置参数也是可以的。”也是错的(所以就先不考虑vscode的事,现在手动gdb都不行了),实际上手动进 gdb的话,符号文件感觉是根本没有读取成功。
如上图:
各位大佬可以直接看这条附言(具体见4楼):
我把 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 的做法),才能去读取的。
现在有两个解决方案:
正在尝试解决中,各位大佬如果知道怎么搞,也说一下吧,感谢!
1
MrMissBlack 165 天前
|
2
amiwrong123 OP @MrMissBlack #1
![]( https://s3.bmp.ovh/imgs/2024/05/26/182008722285f021.png) 试了一下,打断点是可以的。b bootmain 这样打断点也是可以 的了。 |
3
amiwrong123 OP @MrMissBlack #1
符号信息 肯定是生成了的。目前实验的结果: 1. 另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以的。 2. 另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(昨天不知道为啥不行,但是今天你一说我一试,然后都好了。我两个符号文件 obj/boot/boot.out obj/kern/kernel 都试了,都是可以的了。而且都试了 直接打断点在代码地址、函数名称 都是可以的了) 3. 唯独这个 vscode 的 gdb ,我是没有弄好。刚才试了一下,还是不行。哎 |
4
amiwrong123 OP @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 不去自动读这个文件。 |
5
MrMissBlack 165 天前
@amiwrong123 #4 哈哈,搞好就可以了。三种方法,第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的,最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands
|
6
amiwrong123 OP @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 } |