现场
我的开发环境为
arm(M2),但是我的项目只支持运行在
x86 上,这可以借助 rosetta 的转译从而适配
arm(这个过程是透明的)。但是目前这种方法可能还存在局限性,比如不能够直接使用
gdb 进行调试,解决这个问题的答案是使用
gdbserver
先放上结论
- 将你要调试的程序使用
[sudo] ROSETTA_DEBUGSERVER_PORT=<某个空闲端口>来运行 - 分情况讨论
gdb调试:另一个终端输入gdb,运行后依次输入set architecture i386:x86-64file <上一步运行的调试程序的绝对路径>target remote localhost:<上一步命令的端口>
visual studio code图形化界面调试:launch.json增加属性"miDebuggerServerAddress": "localhost:<上一步命令的端口>"
现在回过头来,假设已经部署好了一个 x86 环境

使用下面这个例子
1 |
|
编译
1 | g++ -std=c++17 -g -o test test.cc |
visual studio code 使用以下这个 launch.json
来调试
1 | { |
当按下 F5 调试时,gdb 会报错
Couldn't get registers: Input/output error

参考 Debugging
an x86 application in Rosetta for Linux 和 Can't
debug with Docker toolchain,给出的方法是改用 gdbserver
来调试
使用 gdb

先在终端输入
1 | ROSETTA_DEBUGSERVER_PORT=12345 ./test |
然后打开另一个终端,执行 gdb,然后依次输入
1 | set architecture i386:x86-64 |
然后就可以开始调试了
使用 vscode gui 调试
只需要在 launch.json(以上面的配置为基础)加上
1 | { |
然后也是先在另一个终端加上环境变量执行要调试的程序,之后就是用熟悉的方式去调试了