MacOS Monterey 12.0.1下Clion如何用leaks定位C++内存泄漏具体代码行
Mac M1 使用leaks工具获取内存泄漏对应代码行号的解决方案
前置编译配置
要让leaks识别代码行号,首先需要编译器生成调试符号:
- 在CLion项目的
CMakeLists.txt中添加以下编译参数,关闭优化并开启调试符号生成:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0") # 如果你用Release模式编译也需要查泄漏的话可以加下行,一般Debug模式即可 # set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g")
- 修改完成后重新加载CMake配置,全量重新编译项目。
运行时开启内存分配栈日志
macOS默认不会记录每一次内存分配的调用栈,需要手动开启环境变量MallocStackLogging:
终端运行方式
直接在运行命令前添加环境变量即可:
MallocStackLogging=1 leaks -atExit -- ./你的二进制文件名
-atExit参数会在程序运行结束后自动输出完整的leaks报告,不需要手动查找进程ID。
CLion运行方式
- 点击CLion右上角运行配置的下拉框,选择「编辑配置」
- 在弹出窗口的「环境变量」栏,添加键值对
MallocStackLogging=1 - 保存配置后运行程序,运行结束后在控制台就能看到完整的带调用栈的泄漏报告
安全限制警告处理
如果还是出现Process is not debuggable的提示,不需要完全关闭SIP,只需要放开调试权限即可:
- 重启Mac,长按电源键直到进入恢复模式
- 打开顶部菜单栏的「终端」,执行命令:
csrutil enable --without debug
- 重启设备后再次执行上述操作即可正常获取带行号的泄漏报告。
内容的提问来源于stack exchange,提问作者Grobenek
相关产品推荐
相关产品推荐

