LLDB 是否与 gdbserver 兼容(用于调试交叉编译代码?)
Is LLDB compatible with gdbserver (for debugging cross compiled code?)
我是一名 CS 学生,刚刚为 class (Patterson & Hennessy + spim
) 学习了基础 mips
,我正试图找到一个 mips
允许在调试过程中执行任意指令的调试解决方案。
尝试使用 gdb(所以你知道为什么不建议这样做)
推荐mips
交叉编译工具链为qemu
和gdb
,参见mips.com docs and related 。
据我所知,gdb
的 compile code
命令不支持 mips-linux-gnu-gcc
,请参阅 gdb docs ("Relocating the object file") and related 。尝试将 compile code
与mips-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
有没有办法
- 将
lldb
与 gdbserver
一起使用,或
- 从
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
您的情况:
- qemu-mips -s -S 测试;
- lldb 测试
- 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)
我是一名 CS 学生,刚刚为 class (Patterson & Hennessy + spim
) 学习了基础 mips
,我正试图找到一个 mips
允许在调试过程中执行任意指令的调试解决方案。
尝试使用 gdb(所以你知道为什么不建议这样做)
推荐mips
交叉编译工具链为qemu
和gdb
,参见mips.com docs and related
gdb
的 compile code
命令不支持 mips-linux-gnu-gcc
,请参阅 gdb docs ("Relocating the object file") and related compile code
与mips-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
有没有办法
- 将
lldb
与gdbserver
一起使用,或 - 从
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
您的情况:
- qemu-mips -s -S 测试;
- lldb 测试
- 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)