使用Valgrind的callgrind与kcachegrind分析C++程序时遇错误
问题:Callgrind分析fork程序时的QSocketNotifier与GLIBC符号错误
问题背景
我编写了一个通过fork()创建子进程的简单C++程序,程序本身编译运行无异常,但使用Valgrind的Callgrind工具进行性能剖析后,启动KCachegrind查看结果时遇到两个错误:
- QSocketNotifier相关线程兼容性错误
- libpthread.so.0中无法找到
__libc_pthread_init符号(版本为GLIBC_PRIVATE)
复现代码
#include <cstdio> #include <vector> #include <iostream> #include <unistd.h> #include <sys/types.h> int main() { std::cout << "Parent ID: " << getpid() << std::endl; std::vector<char> parent_vec_1(100000); std::vector<char> parent_vec_2(100000); pid_t pid = fork(); if (pid == -1) { std::cout << "Error, could not fork." << std::endl; return -1; } else if (pid == 0) { std::cout << "Child ID: " << getpid() << std::endl; std::vector<char> child_vec_1(100000); return 1; } else { std::cout << "Executing Parent Again" << std::endl; } return 0; }
编译与分析命令
g++ main.cpp && valgrind --tool=callgrind ./a.out kcachegrind callgrind.out.<pid>
错误信息
QSocketNotifier: Can only be used with threads started with QThread kcachegrind: symbol lookup error: /snap/core20/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined symbol: __libc_pthread_init, version GLIBC_PRIVATE
解决方案
1. 修复QSocketNotifier错误
该错误是KCachegrind的Qt线程适配问题,启动时添加环境变量强制使用X11后端即可规避:
export QT_QPA_PLATFORM=xcb && kcachegrind callgrind.out.<pid>
2. 修复libpthread符号查找错误
此问题源于Snap环境下GLIBC版本不兼容,可通过两种方式解决:
- 使用系统原生KCachegrind:若系统通过包管理器(如apt)安装了KCachegrind,直接调用系统版本而非Snap版本:
/usr/bin/kcachegrind callgrind.out.<pid> - 重新安装Snap版KCachegrind:移除现有包后重新安装,必要时切换到经典 confinement 模式:
sudo snap remove kcachegrind sudo snap install kcachegrind --classic
内容的提问来源于stack exchange,提问作者Hassan Zubair
相关产品推荐
相关产品推荐

