V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  程序员

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

  •  
  •   amiwrong123 · 166 天前 · 1081 次点击
    这是一个创建于 166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一些说明:

    • 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 条附言  ·  166 天前

    有点新发现,第一个终端,会因为我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 条附言  ·  166 天前

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

    如上图:

    • 左边是make gdb(这样是读工作目录下的.gdbinit 配置文件)
    • 右边是手动进gdb,然后手动进行设置。右边一直单步调试,虽然跳转是对的,但是根本没有符号。
    第 3 条附言  ·  165 天前

    各位大佬可以直接看这条附言(具体见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  
       165 天前
    编译应该没问题,我看 Makefile 中加了生成符号信息的选项。

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

    试了一下,打断点是可以的。b bootmain 这样打断点也是可以 的了。
    amiwrong123
        3
    amiwrong123  
    OP
       165 天前
    @MrMissBlack #1
    符号信息 肯定是生成了的。目前实验的结果:
    1. 另一个终端 make gdb(这样是读工作目录下的.gdbinit 配置文件),是可以的。
    2. 另一个终端手动进 gdb ,然后再手动设置参数也是可以的。(昨天不知道为啥不行,但是今天你一说我一试,然后都好了。我两个符号文件 obj/boot/boot.out obj/kern/kernel 都试了,都是可以的了。而且都试了 直接打断点在代码地址、函数名称 都是可以的了)
    3. 唯独这个 vscode 的 gdb ,我是没有弄好。刚才试了一下,还是不行。哎
    amiwrong123
        4
    amiwrong123  
    OP
       165 天前
    @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  
       165 天前
    @amiwrong123 #4 哈哈,搞好就可以了。三种方法,第一种是 gdbinit 里面加绝对路径,第二种是把这个文件改名,riscv 版本是这么做的,最后可以在 VSCode 里面手动加载符号文件,搜索 setupCommands
    amiwrong123
        6
    amiwrong123  
    OP
       165 天前
    @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   ·   实用小工具   ·   1043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:46 · PVG 03:46 · LAX 11:46 · JFK 14:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.