Mac使用VSCode单步调试不进代码

问题遇到的现象和发生背景

在mac中使用vscode调试docker环境下的代码,program指定为已经make出的可执行程序
launch.json配置如下图所示,在win上可以成功单步进入代码中,在mac中直接执行完毕,不会进入断点代码。

        {
            "name": "Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/make/ffmpeg_g",
            "targetArchitecture": "arm64", 
            "stopAtEntry": true,
            "args": ["-i","${workspaceFolder}/files/1.wav","${workspaceFolder}/files/.srm"],
            "cwd": "${workspaceFolder}",
            "environment": [],
            "MIMode": "gdb",
            "externalConsole": false,
            "miDebuggerPath": "/usr/bin/gdb"
        }

操作环境、软件版本等信息

mac中vscode连接本地docker容器

我想要达到的结果

可以成功单步进入代码中

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据你的描述,这是一个在macOS上使用VS Code远程调试Docker容器内C/C++程序的问题。
根据你提供的launch.json配置,我发现几个可能的原因:

  1. miDebuggerPath 指定的gdb路径不正确。在macOS上,gdb路径应该为 /usr/bin/gdb,你的配置已经正确,所以应该不是这个原因。
  2. program指定的可执行程序路径不正确。由于在Docker容器内,program需要指定容器内的路径,所以如果指定的仅为宿主机路径,会导致无法进入断点。你应该指定容器内路径,比如 /workspace/make/ffmpeg_g。
  3. Docker容器内缺少gdb调试依赖。Docker容器内需要安装gdb相关的调试包,否则miDebuggerPath指定的gdb无法正常工作。
  4. VS Code C/C++扩展无法连接Docker环境。目前VS Code的C/C++扩展支持远程连接SSH和Windows子系统的Linux环境进行远程调试,但对Docker支持的还不完全。这可能也是一个原因。
    根据这些可能的原因,这里 are 一些解决的试的步骤:
  5. 检查miDebuggerPath设置,确保使用macOS上的gdb路径 /usr/bin/gdb
  6. 将program设置为容器内的绝对路径,比如/workspace/make/ffmpeg_g
  7. 确认Docker镜像或容器内安装了gdb相关的调试依赖,如binutils等
  8. 尝试安装Microsoft C/C++ for Visual Studio Code扩展,它对Docker支持更好,可替换C/C++扩展
  9. 在启动配置中添加preLaunchTask设置为"docker-start",这可以确保每次启动调试会首先启动Docker

其中,我推荐尝试第2步和第3步,指定容器内路径和安装gdb依赖。这两个问题最有可能导致无法进入断点。