M1 Mac CLion使用Toolchains Docker容器无法获取valgrind memcheck输出
解决步骤
1. 修复arm64架构下valgrind版本兼容性问题
你使用的M1芯片为arm64架构,Ubuntu 20.04官方源内置的valgrind 3.15.0版本对arm64支持存在严重缺陷,极易出现运行无输出、崩溃的问题,需要手动编译安装最新稳定版valgrind:
- 先安装编译依赖:
apt update && apt install -y wget bzip2 build-essential - 下载valgrind最新稳定版源码包,解压后进入源码目录
- 执行编译安装命令:
./configure --prefix=/usr/local && make -j$(nproc) && make install - 验证安装:执行
valgrind --version确认版本为最新稳定版即可。
2. 调整Docker容器启动权限
valgrind运行需要额外的系统权限,你当前的启动命令权限不足,需要修改docker run参数,新增--privileged参数:docker run -d --privileged --cap-add sys_ptrace -p127.0.0.1:2222:22 --name clion_remote_env clion/remote-cpp-env:0.5
如果不想开启完全特权模式,也可以额外新增--cap-add SYS_ADMIN参数替代。
3. 确认编译配置符合valgrind要求
valgrind需要带调试符号、无高阶编译优化的二进制文件才能正常输出结果:
- 在CLion中将CMake构建模式设置为
Debug - 确认编译参数中包含
-g调试符号参数,不存在-O2/-O3等优化参数
4. 验证valgrind运行状态
先通过ssh进入容器,手动测试valgrind是否能正常输出:
- 编写简单的测试C代码
#include <stdlib.h> int main() { int* p = malloc(sizeof(int)); *p = 1; return 0; }
- 编译代码:
gcc -g test.c -o test - 执行valgrind检测:
valgrind --leak-check=full ./test
如果手动执行有内存泄漏输出,说明valgrind本身正常,只需在CLion的valgrind配置中,将valgrind执行路径设置为你手动安装的路径/usr/local/bin/valgrind即可;如果手动执行仍无输出,优先检查前两步的配置是否正确。
备选方案
如果上述操作仍无法解决,可以将Docker基础镜像替换为Ubuntu 22.04,其官方源内置的valgrind 3.18.1版本对arm64架构的支持更为完善,无需手动编译即可正常使用。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

