6.828 lab1 的 qemu,如何用 vscode 的 gdb 插件调试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
amiwrong123
V2EX    程序员

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

  •  
  •   amiwrong123 2024-05-25 14:43:58 +08:00 1523 次点击
    这是一个创建于 511 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一些说明:

    • https://pdos.csail.mit.edu/6.828/2018/xv6.html ,用的是 x86 版本的。
    • 用终端先 make qemu-nox-gdb,另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以。
    • 用终端先 make qemu-nox-gdb,另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(如下图)

    但我想用 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:搞了半天没有搞定,求各位大佬解答,感谢!

    第 1 条附言    2024-05-25 17:02:04 +08:00

    有点新发现,第一个终端,会因为我vscode开始debug后,打印出新的log。

    • 第一个终端打印的log,其实就是内核运行完毕了。
    • vscode开始debug后,才会直接提示“The program '/home/liu/6.828/lab/obj/kern/kernel' has exited with code 0 (0x00000000).”。
    • 这两个点 好像对应上了。

    所以,我的vscode的debug应该是发挥作用了的,只是感觉好像是断点没有打上,所以导致整个内核直接运行到末尾了。但我已经在好几个打了断点了啊。哎,还是好奇怪。

    第 2 条附言    2024-05-25 22:34:16 +08:00

    纠正一下,“用终端先 make qemu-nox-gdb,另一个终端手动进 gdb ,然后再手动设置参数也是可以的。”也是错的(所以就先不考虑vscode的事,现在手动gdb都不行了),实际上手动进 gdb的话,符号文件感觉是根本没有读取成功。

    如上图:

    • 左边是make gdb(这样是读工作目录下的.gdbinit 配置文件)
    • 右边是手动进gdb,然后手动进行设置。右边一直单步调试,虽然跳转是对的,但是根本没有符号。
    第 3 条附言    2024-05-26 17:56:27 +08:00

    各位大佬可以直接看这条附言(具体见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. 还是让vscode的gdb,去读取这个.gdbinit文件,但是呢,解决掉 相对路径问题。因为报错就是因为直接读取相对路径的obj/boot/boot.out文件,才报错了。
    2. 不让vscode的gdb,去读取这个.gdbinit文件。

    正在尝试解决中,各位大佬如果知道怎么搞,也说一下吧,感谢!

    6 条回复    2024-05-26 22:24:17 +08:00
    MrMissBlack
        1
    MrMissBlack  
       2024-05-26 16:54:23 +08:00
    编译应该没问题,我看 Makefile 中加了生成符号信息的选项。

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

    试了一下,打断点是可以的。b bootmain 这样打断点也是可以 的了。
    amiwrong123
        3
    amiwrong123  
    OP
       2024-05-26 17:22:55 +08:00
    @MrMissBlack #1
    符号信息 肯定是生成了的。目前实验的结果:
    1. 另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以的。
    2. 另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(昨天不知道为啥不行,但是今天你一说我一试,然后都好了。我两个符号文件 obj/boot/boot.out obj/kern/kernel 都试了,都是可以的了。而且都试了 直接打断点在代码地址、函数名称 都是可以的了)
    3. 唯独这个 vscode 的 gdb ,我是没有弄好。刚才试了一下,还是不行。哎
    amiwrong123
        4
    amiwrong123  
    OP
       2024-05-26 17:37:15 +08:00
    @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
        5
    MrMissBlack  
       2024-05-26 22:05:39 +08:00
    @amiwrong123 #4 哈哈,搞好就可以了。三种方法,第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的,最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands
    amiwrong123
        6
    amiwrong123  
    OP
       2024-05-26 22:24:17 +08:00
    @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
    }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1217 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 17:35 PVG 01:35 LAX 10:35 JFK 13:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86