- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 gprof “平面配置文件”输出,其中列出了我的所有函数,包括静态函数。但是,对于声明为“静态”的函数,“calls”、“self ms/call”和“total ms/call”列都是空的。我也想查看这些功能的数据;对我来说,它们实际上比模块中的公共(public)函数有趣得多。例如:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
55.32 3.38 3.38 Static_Func1
16.61 4.39 1.01 Static_Func2
12.44 5.16 0.76 2 380.00 380.00 Public_Func1
9.90 5.76 0.60 Static_Func3
2.78 5.93 0.17 Static_Func4
0.98 5.99 0.06 12463589 0.00 0.00 main
0.65 6.03 0.04 1200000 0.00 0.00 Public_Func2
0.33 6.05 0.02 2 10.00 10.00 Public_Func3
0.33 6.07 0.02 Static_Func5
0.33 6.09 0.02 free
0.33 6.11 0.02 malloc
0.00 6.11 0.00 1 0.00 0.00 Public_Func4
我找到了 Why does gprof occasionally not print number of calls for particular functions?这解释了为什么我没有看到这些函数的输出,但是除了去除静态声明之外还有什么办法可以看到它吗?我知道我可以使用 -a
来抑制打印静态函数,但我想做相反的事情并且看不到它的选项。
当我编辑代码以从上述配置文件中的静态函数中删除“static”关键字时,main 的“调用”变为空(我期望为 1,所以无论哪种方式都是错误的)。更有用的是,不仅填充了字段,而且还列出了那些静态函数调用的任何函数。我希望能够在不更改任何代码的情况下做到这一点。
我还找到了Is GNU gprof buggy?这似乎遇到了同样的问题,但解决方案是编辑代码以强制编译器不内联某些函数。我不想仅仅为了分析而编辑我的代码,我希望能够看到我现在存在的所有函数。
版本信息,在 Windows 7 64 位下的 MinGW shell 中运行:
$ which gprof
/mingw/bin/gprof.exe
$ gprof --version
GNU gprof (GNU Binutils) 2.22
Based on BSD gprof, copyright 1983 Regents of the University of California.
This program is free software. This program has absolutely no warranty.
最佳答案
我不是在这里尝试回答,而是我在 cygwin
中遇到的相同问题的进一步延续,GNU gprof (GNU Binutils) 2.24.51.20140528
(我已经在 Ubuntu(32/64 位)上运行了这段代码,我没有遇到任何问题):
#include<stdio.h>
#include<stdlib.h>
#define N1 100
#define N2 100
#define N3 100
#define N4 100
#define USE_STATIC
#ifdef USE_STATIC
static
#endif
void f5() {
int i;
for (i = 0; i < 10; i++) {
}
}
#ifdef USE_STATIC
static
#endif
void f4() {
int i;
for (i = 0; i < N4; i++) {
f5();
}
}
#ifdef USE_STATIC
static
#endif
void f3() {
int i;
for (i = 0; i < N3; i++) {
f4();
}
}
void f2() {
int i;
for (i = 0; i < N2; i++) {
f3();
}
}
void f1() {
int i;
for (i = 0; i < N1; i++) {
f2();
}
}
int main() {
f1();
return 0;
}
禁用 USE_STATIC
宏后,我得到了 gprof 报告的平面数据(这似乎是合理的):
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
85.90 1.98 1.98 100000000 0.00 0.00 f5
9.98 2.21 0.23 _mcount_private
3.47 2.29 0.08 1000000 0.00 0.00 f4
0.65 2.31 0.01 _fentry__
0.00 2.31 0.00 10000 0.00 0.00 f3
0.00 2.31 0.00 100 0.00 0.02 f2
0.00 2.31 0.00 1 0.00 2.06 f1
现在,如果我启用它,它就会全部关闭:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
79.48 1.82 1.82 f5
17.47 2.22 0.40 _mcount_private
2.18 2.27 0.05 f4
0.44 2.28 0.01 _fentry__
0.44 2.29 0.01 f3
0.00 2.29 0.00 101010000 0.00 0.00 __gcc_deregister_frame
0.00 2.29 0.00 100 0.00 0.00 f2
0.00 2.29 0.00 1 0.00 0.00 f1
据我所知,mcount()
在这些函数中的每一个中都被正确调用,所以我不知道是什么让 gprof 把调用计数搞得一团糟。毕竟这应该是它能够输出的唯一精确数据。无论如何,时间信息是完全不可靠的(尤其是对于快速完成的程序)。
这里有一个历史性的 stackoverflow 主题,列出了 gprof
的一些更好的替代方案:http://archive.today/9r927
您可能想去那里看看。我知道我会...
关于c - 查看 gprof 输出中的静态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24617454/
这个问题在这里已经有了答案: Time Sampling Problems with gprof (1 个回答) 关闭 6 年前。 我有一个简单的排序程序,我正在对它进行分析,以便有一个案例来研究
我正在尝试分析一些 C 代码,但最直观的昂贵函数之一并未显示在 GProf 输出中。 int main() { initialise... haloSwap(); for(..
我正在尝试使用 gprof 来分析我正在开发的一些数字代码,但是 gprof 似乎无法从我的程序中收集数据。这是我的命令行: g++ -Wall -O3 -g -pg -o fftw_test fft
在各种示例程序上使用 Ubuntu 17.04 中的 gprof 2.28 和 gcc 6.3.0 我得到每个类别的空输出。如果我在一个示例程序上运行 gprof -i,我得到: 1 histogra
我知道以前有人问过类似的问题,但是: 关于 gprof produces empty output 我在 Windows 10 上使用来自 MSYS2 的 GCC 10.2.0,即它是 MingW64
我们正在开发一个多线程项目。我的同事说 gprof 可以完美地工作,无需处理多线程程序。我前段时间读过其他内容。 http://sam.zoy.org/writings/programming/gpr
我在我的可执行文件上运行 gprof,但该可执行文件花费了大量时间 wait() ing 以完成子进程。等待时间是否计入 gprof 时间? 最佳答案 我没有经常使用 gprof,但据我所知,wait
这是一个臃肿的问题,所以我提前道歉。我很好奇 gprof 在低技术水平上工作。我知道它是由计时器完成的,但是为什么需要专门编译可执行文件才能对其进行分析?编译是否会导致为统计分配空间? 另外,时间是如
我正在使用 -pg 选项运行我的程序。当我打开输出 gmon.out 它只是累积列表而不是调用图。我该如何解决? 我知道这里之前有人问过这个问题:gprof - File is missing cal
我正在尝试使用 gprof 命令:gprof -s executable.exe gmon.out gmon.sum合并从我的程序的 2 次运行中收集的分析数据。但是出现以下错误: gprof: ou
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我尝试使用 gprof(我必须使用 gprof - 没有其他选项可用)当我得到平面文件时,结果是空的,尽管一切正常。 顺便说一下,代码是用 c 写的,所以我使用的是 gcc。 结果: Each sam
我正在尝试 2 配置一个 cpp 代码。我使用 -pg 标志进行编译,在分析它以获得输出后,我得到了一些非常奇怪的函数名称。这是我正在使用的 make 文件: # Makefile for paral
问题在于 gmon.out 文件没有显示正确的数据。所有时间都为 0,没有任何测量。gmon.out 文件通常生成。我正在使用 C++ 的 eclipse ide,并像往常一样链接、编译和运行程序。
我创建了一个简单的程序: #include void ssleep(unsigned int s) { usleep(1000000*s); } int main(int, char**) {
我正在尝试使用 gprof分析我编写的程序,并收到难以理解的结果。大多数函数名称都以 _abfcd96687bed377dcecdf193c89698 的形式出现。我相信它们来 self 链接的第三方
我对分析函数 grep_source_is_binary()[1] 很感兴趣,它的代码如下: static int grep_source_is_binary(struct grep_source *
我在 GPROF Automating the profling of C program using GPROF 上问了一个问题 看来我已经找到了一半的解决方案(我现在知道如何使用 bash 脚本自
我正在运行 Ubuntu 16.10 并尝试使用 gprof 分析程序。我用标志 -pg 编译,程序是单线程的。实际的编译命令是: g++ -I. -std=c++11 -Wall -Wextra -
我刚开始使用 gprof 并尝试生成一个调用图。我正在使用 cmake 来设置我的 makefile,我正在设置 CMAKE_EXE_LINKER_FLAGS = -gp 以启用分析。我启用的唯一 c
我是一名优秀的程序员,十分优秀!