ARM设备上通过Rosetta调试X86_64 C++程序时,VSCode GDB调试因CustomAttributeFormatException失败
我之前也碰到过几乎一模一样的坑!在ARM设备上用Rosetta转译x86_64的C++程序,命令行里GDB跑的顺风顺水,结果一到VS Code里启动调试就报CustomAttributeFormatException,折腾了好几天才摸清楚几个可行的解决办法,给你分享下:
先确认GDB的架构版本是否匹配
VS Code有时候会默认调用系统自带的ARM架构GDB,这在Rosetta转译场景下肯定会出冲突。你可以先在命令行里用file <gdb路径>确认GDB的架构,然后在launch.json的miDebuggerPath字段指定x86_64版本的GDB路径。比如正确的配置片段应该是这样:{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/你的程序名", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [{"name": "ROSETTA_DEBUGSERVER_PORT", "value": "1234"}], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/x86_64-linux-gnu-gdb", // 替换成你的x86_64 GDB路径 "setupCommands": [ { "description": "启用GDB美化输出", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }提前设置环境变量再启动VS Code
有时候在launch.json里设置ROSETTA_DEBUGSERVER_PORT会因为加载时机问题不生效。你可以试试在终端里先导出这个变量,再启动VS Code:export ROSETTA_DEBUGSERVER_PORT=1234 code .这样整个VS Code进程都会继承这个环境变量,调试时就不会出现变量缺失或者不兼容的情况。
禁用GDB自动符号加载
CustomAttributeFormatException大多是因为GDB在加载程序符号时,Rosetta转译后的程序里的自定义属性格式和ARM GDB的解析逻辑不兼容。你可以在launch.json的setupCommands里加一条命令禁用自动符号加载:"setupCommands": [ { "description": "禁用自动加载符号", "text": "set auto-solib-add off", "ignoreFailures": false }, { "description": "启用GDB美化输出", "text": "-enable-pretty-printing", "ignoreFailures": true } ]如果之后需要加载特定库的符号,再手动用
add-symbol-file命令加载就行。换用attach模式绕开启动冲突
如果上面的方法都不管用,你可以试试用命令行启动GDB并监听端口,然后在VS Code里用attach模式连接,这是我当时临时解决问题的办法:- 终端里启动x86_64 GDB并加载程序:
ROSETTA_DEBUGSERVER_PORT=1234 x86_64-linux-gnu-gdb 你的程序名 - 在GDB控制台里执行
target remote :1234,再输入run启动程序 - 然后在VS Code的
launch.json里加一个attach配置:{ "name": "(gdb) Attach", "type": "cppdbg", "request": "attach", "program": "${workspaceFolder}/你的程序名", "miDebuggerServerAddress": "localhost:1234", "miDebuggerPath": "/usr/bin/x86_64-linux-gnu-gdb" }
最后启动这个attach配置就能正常调试了。
- 终端里启动x86_64 GDB并加载程序:
更新相关工具版本
老版本的VS Code C/C扩展和GDB对Rosetta转译场景的支持都不太好,建议把C/C扩展更到最新版本,同时x86_64的GDB也更到稳定的新版本,很多兼容性问题都会随着版本更新修复。
备注:内容来源于stack exchange,提问作者Pietro

