Ubuntu16.04下CMake链接gperftools失败,无性能日志生成
排查Ubuntu 16.04下gperftools CPU Profile日志未生成的问题
我来帮你排查Ubuntu 16.04下gperftools CPU profiling日志没生成的问题——我之前在这个版本的系统上折腾过类似的情况,咱们一步步捋清楚可能的问题点:
1. 先确认gperftools安装是否完整
Ubuntu 16.04上安装gperftools时,别只装基础包,一定要把开发依赖也装上,不然编译链接的时候会缺文件:
sudo apt-get install gperftools libgoogle-perftools-dev
你可以检查下/usr/lib/x86_64-linux-gnu下有没有libprofiler.so和libprofiler.a,确认安装到位。
2. CMake配置环节的细节检查
你提到把FindGperftools.cmake重命名为GperftoolsConfig.cmake放到包内cmake文件夹,这里有两个容易忽略的点:
- 要让CMake能找到这个配置文件,得先在CMakeLists.txt里把你的cmake目录加入模块搜索路径:
不然CMake会默认去系统路径找,根本看不到你放的自定义配置文件。set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - 链接可执行文件时要确保配置正确,完整的CMake代码应该类似这样:
编译时留意CMake的输出日志,确认它成功找到了gperftools的库和头文件,没有报错信息。find_package(Gperftools REQUIRED) include_directories(${GPERFTOOLS_INCLUDE_DIR}) target_link_libraries(你的可执行文件名 ${GPERFTOOLS_PROFILER})
3. 环境变量与运行环节的关键坑点
你说导出了CPUPROFILE但没生成日志,这部分是最容易踩坑的:
- 路径必须是绝对路径,且你有写权限!比如你指定的
/my_path/prof,要先确保/my_path目录存在,而且当前用户能写入:
用相对路径很容易出问题,比如程序运行的工作目录和你想生成日志的目录不一致。mkdir -p /my_path chmod 755 /my_path - 环境变量要和程序在同一个终端会话里生效:如果你是临时导出,要先执行
export CPUPROFILE=/my_path/prof.log,紧接着在同一个终端运行你的程序;如果是写到.bashrc里,记得执行source ~/.bashrc让配置生效后再运行。 - 程序要正常退出!gperftools默认是在程序正常结束时才写入日志,如果你用Ctrl+C强制终止,日志可能不会生成。如果你的程序是长期运行的,可以在代码里手动调用
ProfilerStop()触发写入:#include <gperftools/profiler.h> // 在合适的地方(比如程序退出前)调用 ProfilerStop(); - 如果程序运行时间太短,gperftools可能来不及收集数据并写入日志,可以给程序加个延迟或者让它执行更多逻辑再测试。
4. 额外的调试手段
如果上面的步骤都试过还是不行,咱们用工具排查:
- 用
ldd检查可执行文件是否正确链接了profiler库:
如果输出里有ldd 你的可执行文件名 | grep profilerlibprofiler.so.0之类的条目,说明链接成功;如果没有,那就是CMake配置环节出了问题,得回去重新检查链接步骤。 - 也可以绕开CMake链接,直接用动态预加载的方式测试:
这种方式如果能生成日志,说明是你CMake配置里的链接逻辑有问题;如果还是不行,那就是环境或者gperftools本身的安装问题。export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libprofiler.so export CPUPROFILE=/my_path/prof.log ./你的可执行文件名
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

