【问题标题】:How to use gprof with cmake如何在 cmake 中使用 gprof
【发布时间】:2014-12-16 23:42:23
【问题描述】:

我查看了几十个使用 gprof 进行分析的教程。我正在尝试使用 SMT 求解器 dReal 的代码。为了构建程序,我首先安装了 g++-4.8、Bison、Flex 和 Cmake。然后构建 dReal,指令执行如下:

git clone git@github.com:soonhokong/dReal.git dreal  
cd dreal  
mkdir -p build/release  
cd build/release  
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_C_COMPILER=gcc-4.8 ../../src  
make

我应该在哪里添加-pg?我是编程新手,因此非常感谢推理而不是答案。我知道您应该将 -pg 添加到编译阶段,但所有教程都说将其放在 g++ 或 gcc 之后。我找不到如何修改 cmake 的代码。我确实尝试将构建类型更改为 PROFILE,但这没有帮助。

【问题讨论】:

标签: cmake profiling gprof dreal


【解决方案1】:

为了使用 gprof,你需要编译和链接-pg 选项。

CMakeLists.txt 应该有一个类似 Ami Tavory 提到的设置,其中命令行选项与硬编码选项相结合,因此使用构建良好的 cmake 项目执行此操作的好方法是:

cmake -DCMAKE_CXX_FLAGS=-pg -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg <SOURCE_DIR>

【讨论】:

    【解决方案2】:

    我是 dReal 的维护者之一,Soonho Kong。如果您在问题上加上“dreal”标签,我们将更容易回答有关 dReal 的问题。

    1. 一般情况下,您可以通过运行将-pg 等编译器标志传递给cmake:

      cmake -DCMAKE_CXX_FLAGS=-pg​​

    2. 对于分析,我通常使用valgrind + callgrind

    3. 为了测量代码覆盖率,我们使用 gcov 和 lcov 工具。您可能需要查看how we set up the compiler flags,它可以帮助您为 gprof 设置自己的编译器标志。

    【讨论】:

    • 这对我也很有效。为了将来参考,在CMakeLists.txt 中,我有set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} blah blah blah"),它将硬编码的内容与 cmd 行提供的内容结合在一起。
    • 是否像这样传递它会覆盖CMakeLists.txt(或包含的 .cmake 文件)中设置的其他标志,或者它是预先/附加到项目的 MAKE_CXX_FLAGS 吗?这会被传递给链接器(我猜程序也需要与-pg 链接)?
    • 它对我有用,但我添加了 -DCMAKE_C_FLAGS=-pg​​ -DCMAKE_CXX_FLAGS=-pg​​ -DCMAKE_BUILD_TYPE=Debug 然后我单独运行应用程序,而不是使用 gprof 记录分析。 > cmake -DCMAKE_C_FLAGS=-pg​​ -DCMAKE_CXX_FLAGS=-pg​​ -DCMAKE_BUILD_TYPE=调试 .. > 制作 > ./application > gprof ./application gmon.out > profile.txt > gprof ./application -l gmon.out > profile_line.txt
    • gprofvalgrind+callgrind 做不同的事情,给你不同的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2023-04-02
    • 2012-12-04
    相关资源
    最近更新 更多