LLDB 是否与 gdbserver 兼容(用于调试交叉编译的代码?)

oko*_*vko 8 mips lldb

我是一名 CS 学生,刚刚学习mips了课堂基础知识(Patterson & Hennessy + spim),我正在尝试找到一种mips调试解决方案,允许在调试过程中执行任意指令。

尝试使用 gdb(所以你知道为什么不建议这样做)

推荐的mips交叉编译工具链是qemuand gdb,参见mips.com 文档和相关问答

gdbcompile code命令不支持mips-linux-gnu-gcc,据我所知,请参阅gdb 文档(“重定位目标文件”)和相关的Q/A。我得到的错误mallocmmap和无效的内存错误(显示的东西是想错了与即席连接gdb尝试使用时执行)compile codemips-linux-gnu-gcc,甚至过滤出硬编码的编译参数后mips-linux-gnu-gcc不承认。

实际问题

lldb有一个类似的命令expression,请参阅lldb 文档,我有兴趣lldbqemu. 该expression命令也依赖于clang而不是gcc,但在 clang 中交叉编译相对简单(clang -target mips-linux-gnu“正常工作”)。唯一的问题是qemu-mips -g启动gdbserver,我找不到启动选项lldb-server

我已经阅读了关于远程调试的lldb 文档,并且有一个选项可以选择remote-gdb-server作为platform. 我找不到太多关于 的文档remote-gdb-server,但名称似乎暗示lldb可以与gdbserver.

这是我尝试使这项工作:

qemu-mips -g 1234 test

lldb test
(lldb) platform select remote-gdb-server
  Platform: remote-gdb-server
  Connected: no
(lldb) platform connect connect://localhost:1234
  Platform: remote-gdb-server
  Hostname: (null)
  Connected: yes
(lldb) b main
  Breakpoint 1: where = test`main + 16 at test.c:4, address = 0x00400530
(lldb) c
  error: invalid process
Run Code Online (Sandbox Code Playgroud)

有没有办法

  1. 使用lldbgdbserver,或
  2. 发射lldb-serverqemu-mips而不是gdbserver

以便我可以在调试mips代码时执行指令?

注意:我知道我可以改为使用qemu系统仿真来仅lldb-server在遥控器上运行。我曾尝试debian mips使用本指南进行虚拟化,但 netinstaller 无法检测到我的网卡。基于大量的 SO Q/A 和在线论坛,看起来解决这个问题很难。所以现在我试图避免整个系统仿真。

Pri*_*kin 7

是的

\n

将 LLDB 与 QEMU 结合使用

\n

LLDB 支持 QEMU 使用的 GDB 服务器,因此您可以与上一节执行相同的操作,但需要进行一些命令修改,因为 LLDB 有一些与 GDB 不同的命令\n您可以运行 QEMU 以侦听之前的“GDB 连接”开始执行任何代码来调试它。

\n
qemu -s -S <harddrive.img>\n
Run Code Online (Sandbox Code Playgroud)\n

...将设置 QEMU 监听端口 1234 并等待 GDB 连接到它。然后,从远程或本地 shell:

\n
\nlldb kernel.elf\n(lldb) target create "kernel.elf"\nCurrent executable set to '/home/user/osdev/kernel.elf' (x86_64).\n(lldb) gdb-remote localhost:1234\nProcess 1 stopped\n* thread #1, stop reason = signal SIGTRAP\n    frame #0: 0x000000000000fff0\n->  0xfff0: addb   %al, (%rax)\n    0xfff2: addb   %al, (%rax)\n    0xfff4: addb   %al, (%rax)\n    0xfff6: addb   %al, (%rax)\n
Run Code Online (Sandbox Code Playgroud)\n

(如有必要,请将 localhost 替换为远程 IP / URL。)然后开始执行:

\n
(lldb) c\nProcess 1 resuming\n
Run Code Online (Sandbox Code Playgroud)\n

设置断点:

\n
(lldb) breakpoint set --name kmain\nBreakpoint 1: where = kernel.elf`kmain, address = 0xffffffff802025d0\n\n
Run Code Online (Sandbox Code Playgroud)\n

对于你的情况:

\n
    \n
  1. qemu-mips -s -S 测试;
  2. \n
  3. LLDB测试
  4. \n
  5. gdb-远程本地主机:1234
  6. \n
\n

这是我的,你可以参考:

\n
\n#############################################   gdb    #############################################\nQEMU_GDB_OPT := -S -gdb tcp::10001,ipv4\n# \xe8\xb0\x83\xe8\xaf\x95\xe9\x85\x8d\xe7\xbd\xae\xef\xbc\x9a-S -gdb tcp::10001,ipv4\nqemudbg:\nifeq ($(BOOT_MODE),$(BOOT_LEGACY_MODE))\n    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT)\nelse\nifeq ($(BOOT_MODE),$(BOOT_GRUB2_MODE))\nifeq ($(EFI_BOOT_MODE),n)\n    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT) -cdrom $(KERNSRC)/$(OS_NAME).iso\nelse\n    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT) -bios $(BIOS_FW_DIR)/IA32_OVMF.fd -cdrom $(KERNSRC)/$(OS_NAME).iso\nendif\nendif\nendif\n\n# \xe8\xbf\x9e\xe6\x8e\xa5gdb server: target remote localhost:10001\ngdb:\n    $(GDB) $(KERNEL_ELF)\n\n\n#############################################   lldb    #############################################\n\nQEMU_LLDB_OPT := -s -S\nLLDB := lldb\n\nqemulldb:\nifeq ($(BOOT_MODE),$(BOOT_LEGACY_MODE))\n    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT)\nelse\nifeq ($(BOOT_MODE),$(BOOT_GRUB2_MODE))\nifeq ($(EFI_BOOT_MODE),n)\n    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT) -cdrom $(KERNSRC)/$(OS_NAME).iso\nelse\n    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT) -bios $(BIOS_FW_DIR)/IA32_OVMF.fd -cdrom $(KERNSRC)/$(OS_NAME).iso\nendif\nendif\nendif\n\n\nlldb:\n    $(LLDB) $(KERNEL_ELF)\n\n\n
Run Code Online (Sandbox Code Playgroud)\n