You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM设备上通过Rosetta调试X86_64 C++程序时,VSCode GDB调试因CustomAttributeFormatException失败

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模式连接,这是我当时临时解决问题的办法:

    1. 终端里启动x86_64 GDB并加载程序:
      ROSETTA_DEBUGSERVER_PORT=1234 x86_64-linux-gnu-gdb 你的程序名
      
    2. 在GDB控制台里执行target remote :1234,再输入run启动程序
    3. 然后在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配置就能正常调试了。

  • 更新相关工具版本
    老版本的VS Code C/C扩展和GDB对Rosetta转译场景的支持都不太好,建议把C/C扩展更到最新版本,同时x86_64的GDB也更到稳定的新版本,很多兼容性问题都会随着版本更新修复。

备注:内容来源于stack exchange,提问作者Pietro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:13:16