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

使用GCC -p选项生成空gmon.out文件的问题求助

GCC -p选项生成空gmon.out文件的问题求助

我现在碰到一个特别费解的问题:两个C项目都在VS Code的Docker Dev Container(aarch-64-linux-gnu环境,GCC 12.2.0)里编译,CMake配置逻辑基本一致,但其中一个生成的gmon.out几乎是空的,用gprof查看时看不到任何有效 profiling 数据;另一个项目却能正常生成完整的gmon.out,gprof输出也符合预期。

先给大家梳理下基本背景:

  • 两个项目都通过SANITIZERS变量加入了-p选项(用于生成gmon.out),同时配置了-fno-omit-frame-pointer以及地址、泄漏 sanitizer
  • 我用nm检查过两个项目的可执行文件,确认都带有调试符号
  • 尝试过添加-fno-pie选项,但完全没解决问题
  • 有问题的项目依赖了几个自己写的静态库(My_list、My_string、BST),其中My_string依赖My_list,BST依赖前两者,所以CMake里只直接链接了BST(依赖会自动传递)

正常工作的项目CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(PSF C)

set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include_directories(src libs)
add_subdirectory(libs/My_list)

set(SANITIZERS -p -fno-omit-frame-pointer -fsanitize=address,leak)
add_compile_options(-Wall -Wextra ${SANITIZERS})

set(SOURCES src/main.c src/expr/expr_parsing.c src/expr/expr_processing.c src/expr/expr.h src/PSF/psf.c src/PSF/psf.h)
set(DEPS My_list)

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${SANITIZERS} ${DEPS})

生成空gmon.out的项目CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(lab4a C)

set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include_directories(src libs)
add_subdirectory(libs/My_list)
add_subdirectory(libs/My_string)
add_subdirectory(libs/BST)

set(SANITIZERS -p -fno-omit-frame-pointer -fsanitize=address,leak)
add_compile_options(-Wall -Wextra ${SANITIZERS})

set(SOURCES src/main.c)
set(DEPS BST)

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${SANITIZERS} ${DEPS})

gprof输出对比

正常项目的gprof输出:

Flat profile:

Each sample counts as 0.01 seconds.
  no time accumulated

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00        8     0.00     0.00  PSF_dtor
  0.00      0.00     0.00        8     0.00     0.00  _PSF_compare
  0.00      0.00     0.00        8     0.00     0.00  _PSF_copy
  0.00      0.00     0.00        8     0.00     0.00  _PSF_free
  0.00      0.00     0.00        4     0.00     0.00  PSF_ctor
  0.00      0.00     0.00        4     0.00     0.00  PSF_empty_ctor
  0.00      0.00     0.00        4     0.00     0.00  PSF_mul
  0.00      0.00     0.00        4     0.00     0.00  _Term_cmp
  0.00      0.00     0.00        3     0.00     0.00  Expr_ctor
  0.00      0.00     0.00        3     0.00     0.00  Expr_dtor
  0.00      0.00     0.00        3     0.00     0.00  Expr_simplify
  0.00      0.00     0.00        2     0.00     0.00  read_line
  0.00      0.00     0.00        1     0.00     0.00  Expr_mul
  0.00      0.00     0.00        1     0.00     0.00  Expr_print

有问题项目的gprof输出:

Flat profile:

Each sample counts as 0.01 seconds.
  no time accumulated

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  % the percentage of the total running time of the

有问题项目的目录结构

.
├── CMakeLists.txt
├── libs
│   ├── BST
│   │   ├── CMakeLists.txt
│   │   ├── lib_BST.h
│   │   ├── src
│   │   │   ├── BST.c
│   │   │   ├── BST_dump.c
│   │   │   ├── BST_files.c
│   │   │   ├── BST.h
│   │   │   ├── BST_validation.c
│   │   │   └── Node
│   │   │       ├── node.c
│   │   │       └── node.h
│   │   └── utils
│   │       ├── utils.c
│   │       └── utils.h
│   ├── My_list
│   │   ├── CMakeLists.txt
│   │   ├── lib_My_list.h
│   │   └── src
│   │       ├── List.c
│   │       ├── List.h
│   │       ├── List_node
│   │       │   ├── List_node.c
│   │       │   └── List_node.h
│   │       └── List_verify.c
│   └── My_string
│       ├── CMakeLists.txt
│       ├── lib_My_string.h
│       └── src
│           ├── My_string.c
│           └── My_string.h
├── readme.md
├── src
│   └── main.c
├── test.py
└── tree_tests.txt

我反复对比了两个项目的CMake配置,唯一明显的区别就是第二个项目引入了更多的静态库依赖,但这些依赖本身应该也继承了父项目的编译选项吧?实在搞不懂为什么第二个项目的gmon.out会是空的,有没有大佬能帮我分析下原因?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:43:03