使用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
相关产品推荐
相关产品推荐

