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

Is LLDB compatible with gdbserver (for debugging cross compiled code?)

我是一名 CS 学生,刚刚为 class (Patterson & Hennessy + spim) 学习了基础 mips,我正试图找到一个 mips 允许在调试过程中执行任意指令的调试解决方案。

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

推荐mips交叉编译工具链为qemugdb,参见mips.com docs and related

据我所知,

gdbcompile code 命令不支持 mips-linux-gnu-gcc,请参阅 gdb docs ("Relocating the object file") and related 。尝试将 compile codemips-linux-gnu-gcc,即使过滤了 mips-linux-gnu-gcc 无法识别的硬编码编译参数。

真题

lldb有个类似的命令叫expression,看lldb docs, and I'm interested in using lldb in conjunction with qemu. The expression command also relies on clang as opposed to gcc, but cross compilation in clang比较简单(clang -target mips-linux-gnu"just works")。唯一的问题是 qemu-mips -g 启动 gdbserver,我找不到启动 lldb-server.

的选项

我已经阅读了关于远程调试的 lldb docs,并且有一个选项 select 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

有没有办法

  1. lldbgdbserver 一起使用,或
  2. qemu-mips 启动 lldb-server 而不是 gdbserver

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

注意:我知道我可以改为使用 qemu 系统仿真,以便能够在遥控器上仅 运行 lldb-server。我已尝试使用 this guide 虚拟化 debian mips,但网络安装程序无法检测到我的网卡。根据大量 SO Q/A 和在线论坛,看起来解决这个问题很难。所以现在我试图避免整个系统仿真。

将 LLDB 与 QEMU 结合使用

LLDB 支持 QEMU 使用的 GDB 服务器,所以你可以做与上一节相同的事情,但需要修改一些命令,因为 LLDB 有一些不同于 GDB 的命令 您可以 运行 QEMU 在开始执行任何代码以对其进行调试之前侦听“GDB 连接”。

qemu -s -S <harddrive.img>

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


lldb kernel.elf
(lldb) target create "kernel.elf"
Current executable set to '/home/user/osdev/kernel.elf' (x86_64).
(lldb) gdb-remote localhost:1234
Process 1 stopped
* thread #1, stop reason = signal SIGTRAP
    frame #0: 0x000000000000fff0
->  0xfff0: addb   %al, (%rax)
    0xfff2: addb   %al, (%rax)
    0xfff4: addb   %al, (%rax)
    0xfff6: addb   %al, (%rax)

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

(lldb) c
Process 1 resuming

设置断点:

(lldb) breakpoint set --name kmain
Breakpoint 1: where = kernel.elf`kmain, address = 0xffffffff802025d0

您的情况:

  1. qemu-mips -s -S 测试;
  2. lldb 测试
  3. gdb-远程 localhost:1234

这是我的,你可以参考:


#############################################   gdb    #############################################
QEMU_GDB_OPT := -S -gdb tcp::10001,ipv4
# 调试配置:-S -gdb tcp::10001,ipv4
qemudbg:
ifeq ($(BOOT_MODE),$(BOOT_LEGACY_MODE))
    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT)
else
ifeq ($(BOOT_MODE),$(BOOT_GRUB2_MODE))
ifeq ($(EFI_BOOT_MODE),n)
    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT) -cdrom $(KERNSRC)/$(OS_NAME).iso
else
    $(QEMU) $(QEMU_GDB_OPT) $(QEMU_ARGUMENT) -bios $(BIOS_FW_DIR)/IA32_OVMF.fd -cdrom $(KERNSRC)/$(OS_NAME).iso
endif
endif
endif

# 连接gdb server: target remote localhost:10001
gdb:
    $(GDB) $(KERNEL_ELF)


#############################################   lldb    #############################################

QEMU_LLDB_OPT := -s -S
LLDB := lldb

qemulldb:
ifeq ($(BOOT_MODE),$(BOOT_LEGACY_MODE))
    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT)
else
ifeq ($(BOOT_MODE),$(BOOT_GRUB2_MODE))
ifeq ($(EFI_BOOT_MODE),n)
    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT) -cdrom $(KERNSRC)/$(OS_NAME).iso
else
    $(QEMU) $(QEMU_LLDB_OPT) $(QEMU_ARGUMENT) -bios $(BIOS_FW_DIR)/IA32_OVMF.fd -cdrom $(KERNSRC)/$(OS_NAME).iso
endif
endif
endif


lldb:
    $(LLDB) $(KERNEL_ELF)