You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:12:40