Tag: 分析

x86汇编指令执行计数

大家好,我有一个代码,我想找到每个assembly线执行的次数。 我不关心是通过分析还是仿真,但我想要高精度的结果。 我曾经遇到过一个论坛,它提供了一些脚本代码,但我丢失了链接。 任何人都可以帮助我集思广益吗? 问候 编辑 :Okey我想我已经到了一半。 我根据一篇post对英特尔手册3A第16.4.5节提供的BTS(分支跟踪存储)进行了一些研究。 此function提供分支历史记录。 所以现在我需要你的帮助来查找是否有任何开源脚本或工具来执行此操作。 等待检查您的反馈 欢呼=)!

C函数分析(地址似乎已经过时)

我正在尝试使用-finstrument-functions选项来分析函数调用。 基本上,我所做的是将以下内容写入任何编译源: static int __stepper=0; void __cyg_profile_func_enter(void *this_fn, void *call_site) __attribute__((no_instrument_function)); void __cyg_profile_func_enter(void *this_fn, void *call_site) { int i=0; for( ; i<__stepper; i++ ) printf(" "); printf("E: %p %p\n", this_fn, call_site); __stepper ++; } /* __cyg_profile_func_enter */ void __cyg_profile_func_exit(void *this_fn, void *call_site) __attribute__((no_instrument_function)); void __cyg_profile_func_exit(void *this_fn, void *call_site) { int i=0; __stepper –; for( ; […]

为短代码获得可靠的性能测量

我正在尝试分析一些函数,这些函数以不同的方式实现相同算法的不同版本。 我增加了每个函数运行的次数,这样在单个函数中花费的总时间大约是1分钟(以揭示性能差异)。 现在,运行几次测试会产生令人困惑的结果。 在同一函数的多次执行之间存在巨大的可变性(+ – 50%),并且因此确定哪个函数最快(这是测试的目标)几乎是不可能的。 在运行测试之前,我应该注意一些特殊的事情吗?这样我可以获得更平滑的测量结果吗? 如果不这样做,是多次运行测试并计算每个函数的平均值?

自动assembly循环级别分析

有谁知道任何汇编循环级别分析器? 我一直在使用gprof,但gprof隐藏了循环,它是function级别的分析,但为了优化我的代码,我想要一些东西进入循环级别。 我想让它自动化,只需给我输出像gprof。 我被建议去dtrace但我不知道要开始。 无论如何,任何人都可以指导我吗? 例如 main: pushl %ebp movl %esp, %ebp subl $16, %esp movl $5000000, -4(%ebp) movl $0, -12(%ebp) movl $0, -8(%ebp) jmp .L2 .L3: movl -8(%ebp), %eax addl %eax, -12(%ebp) addl $1, -8(%ebp) .L2: movl -8(%ebp), %eax cmpl -4(%ebp), %eax jl .L3 movl $0, %eax leave ret 例如在gprof中它会说主执行1次而foo执行100次。 但我想知道L2或L3是否执行了1M次,那么我对优化的专注就在这里。 如果我的问题含糊不清,请让我解释一下谢谢

从cscope数据库生成调用树

我想从Linux的c和c ++项目的cscope数据库生成完整和部分调用树。 项目相当大,因此使用项目的完整调用树并不容易,所以我想用函数名的grep-likefilter来限制调用树的生成。 而且我希望能够从任何一点构建“被叫”和“被叫”子树。 因此,工具必须是交互式的,并且易于修补。 PS:我想使用cscope数据库,因为它已经在项目中使用并且生成它相当快。 我使用vim编辑器并拥有X windows系统。 sourceforge上有cbrowser程序,但它的call-tree(callgraph)function被破坏了。

跟踪/分析说明

我想在指令级别对我的C代码进行统计分析。 我需要知道我正在执行多少次加法,乘法,除法等。 这不是您通常的磨码分析要求。 我是算法开发人员,我想估算将代码转换为硬件实现的成本。 为此,我在运行时被问到指令调用故障(解析编译的程序集是不够的,因为它不考虑代码中的循环)。 环顾四周后,似乎VMware可能提供了一个可能的解决方案,但我仍然找不到能够跟踪我的进程的指令调用流的特定function。 你知道任何能够实现这一目标的分析工具吗?

这个基本算法O(n)怎么样?

int G(int a[], int n) { int x=0, i, j; for(i=1; i<n; i=i*2){ for(j=0; j<i; j++) x += a[j]; } return x; } 最坏的情况如何严格限制在该算法O(n)上。 第一个循环是不执行O(log(n)次,第二个循环执行O(n)次是否给出O(n logn)?

使用etrace在C ++中按时间顺序跟踪函数调用

背景: 我有一个很大的模拟工具,我需要了解它的逻辑行为。 为了做到这一点,如果我有函数调用的时间顺序,我将得到的大部分帮助,用于最小的工作示例。 我在网上找到了很多工具,比如CygProfiler和etrace 。 在找到解决方案时,我开始变得非常痛苦,我开始遵循使用调试器“步入”的最疯狂的解决方案。 如果你有一个小程序但不是一个完整的模拟工具,这是一个很好的选择。 问题: 我面临的一个问题是上述解决方案最初是针对C ,它们在编译时会生成一个静态文件( *.o )。 另一方面,模拟工具生成共享库( .so )。 我对较低级别的东西知之甚少,所以当我尝试链接它们时,我似乎失败了。 我专门查看了etrace 文档 ,它说: 要了解如何修改ptrace.c以使用动态库,请查看example2目录。 这里的源代码也创建了一个独立的可执行文件,但PTRACE_REFERENCE_FUNCTION宏的定义与动态库一样。 如果查看repo, example和example2文件夹中的文件没有区别。 在example2只有一个额外的.h文件。 另一方面,如果你看一下src/ptrace.c那就说: 在动态库上使用ptrace时,必须将PTRACE_REFERENCE_FUNCTION宏设置为库中函数的名称。 加载时此函数的地址将是输出到跟踪文件的第一行,并允许将其他入口和出口指针转换为其符号名称。 您可以将宏PTRACE_INCLUDE设置为该函数可访问此源文件所需的任何#include指令。 稍微低于评论代码: /* When using ptrace on a dynamic library, the following must be defined: #include “any files needed for PTRACE_REFERENCE_FUNCTION” #define PTRACE_REFERENCE_FUNCTION functionName `*/ 题: 本质上问题如下:如何在动态库中使用etrace ? […]

gprof:如何为链接到主程序的共享库中的函数生成调用图

我正在研究Linux环境。 我有两个’C’源包train和test_train。 编译时训练包生成libtrain.so test_train链接到libtrain.so并生成可执行的train-test 现在我想用gprof生成一个调用图,它显示了主程序中函数的调用顺序以及libtrain.so中的函数调用顺序。 我正在使用-pg选项编译和链接两个包,调试级别为o0。 在我执行./train-test之后,生成gmon.out。 然后我做: $ gprof -q ./train-test gmon.out 这里,输出显示列车测试中的函数调用图,但不显示libtrain.so中的调用图 可能是什么问题呢 ?

C和C ++源代码分析工具

可能重复: 你最喜欢的分析工具是什么(适用于C ++) 是否有任何好的工具来分析混合了C和C ++的源代码。 有什么优点和缺点,你使用过哪些,并建议使用。 请不要给我一个谷歌工具列表。 我也可以这样做,我想要的是利用使用这些工具的人的个人经验并了解他们的利弊。 提前致谢。