因为之前在Apple Silicon启动的 amd64 容器都是以 Qemu 模式运行的,所以无法正常的使用 GDB 进行调试应用程序。但是在之前 Docker 宣布支持了Rosetta on Linux,这就使得我们可以使用Rosetta来启动amd64架构的容器。然后近日有博主发现Rosetta中内置了 GDB 服务,可以使用这个 GDB 服务在amd64架构的容器中调试 amd64 架构的程序
首先我们需要在 Docker 中开启Rosetta on Linux
然后使用一个 amd64 的镜像来启动一个 amd64 的容器
docker pull --platform=linux/amd64 ubuntu:20.04
docker run -it --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" --platform=linux/amd64 ubuntu:20.04 /bin/bash
这个推荐使用 gef 作为 gdb 的插件,然后使用如下的命令就可以使用rosetta gdb 来调试程序
ROSETTA_DEBUGSERVER_PORT=1234 a.out & gdb
(gdb) set architecture i386:x86-64
(gdb) file ./a.out
(gdb) target remote localhost:1234
(gdb) continue
参考目录
- https://sporks.space/2023/04/12/debugging-an-x86-application-in-rosetta-for-linux/
- https://github.com/microsoft/vscode-cpptools/issues/10788
- https://qiita.com/chimpan/items/574ad8ad0ac142c71c37
- https://developer.apple.com/documentation/virtualization/running_intel_binaries_in_linux_vms_with_rosetta?language=objc