我有一个很大的工作空间,有许多C代码的源文件.虽然我可以使用Object浏览器看到从MS VS2005中的函数调用的函数,但是在MSVC 6.0中,这只显示了在非图形显示中从特定函数调用的函数.另外,它没有显示从say开始调用的函数main(),然后是从它调用的函数,依此类推,更深入到叶级函数内部.
我需要一个工具,它会给我一个功能调用图,用图形表示功能callee,caller用箭头或类似的东西连接,从main()最后一级功能开始,或者至少在一个C源文件中以图形方式显示所有功能的调用图.如果我能打印这张图表会很棒.
任何好的工具(不一定是免费的工具)?
我们如何列出应用程序中调用的所有函数.我尝试使用GDB,但它的回溯列表只能到主函数调用.
我需要更深的列表,即主函数调用的所有函数的列表以及从这些调用的函数调用的函数等等.
有没有办法在gdb中得到它?或者你能给我一些关于如何获得这个的建议吗?
我想知道在使用某个文件中的函数时是否有任何方法可以停止程序.理想情况下,我正在寻找的是:
GDB Stop when use a function from file foo.cpp
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为我正在调试一个不是我的代码而且我不确切地知道调用了哪些函数以及哪些函数不是.GDB中是否有功能可以执行我要查找的内容,或者其他任何推荐的方法来执行类似的操作?
谢谢
如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进?
我希望能够说出(制作):
(gdb) trace Foo* Bar* printf
Run Code Online (Sandbox Code Playgroud)
并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用.有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流.
无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果.我需要保留的调用顺序.
通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数.虽然我愿意完全记录所有功能.或者,也许告诉gdb记录特定库中的所有函数.
某些GDB向导必须有一个用于此常见作业的脚本!
在不修改源代码的情况下,当调用某个函数(例如下例中的func100)时,如何跟踪调用哪些函数以及使用哪些参数.我想输出如下:
enter func100(p1001=xxx,p1002=xxx)
enter func110(p1101=xxx,p1102=xxx)
exit func110(p1101=xxx,p1102=xxx)
enter func120(p1201=xxx,p1202=xxx,p1203=xxx)
enter func121(p1211=xxx)
exit func121(p1211=xxx)
exit func120(p1201=xxx,p1202=xxx,p1203=xxx)
exit func100(p1001=xxx,p1002=xxx)
Run Code Online (Sandbox Code Playgroud)
这可行吗?或者最少修改源代码的解决方案是什么?
我在嵌入式系统上有很大的C代码代码库,遗憾的是没有自动测试用例/套件.这使得重构和重构代码成为一项危险的任务.
手动编写测试用例非常耗时,因此我认为应该可以自动执行此过程的至少某些部分,例如通过跟踪所有函数调用和记录输入和输出值.然后,我可以在测试用例中使用这些值(这对所有人都不起作用,但至少对于某些函数而言).也可能基于收集的数据创建模拟函数.
拥有这样的测试用例会使重构变得不那么危险.
有没有解决方案已经可以做到这一点?如果我必须自己编写代码,最简单的方法是什么?
我想ctags用于查找函数定义,并将它们包装在记录参数值的函数中.另一种可能性可能是gcc编译器插件.
我试图使用stap来跟踪用户空间可执行文件,如此答案所示:https://stackoverflow.com/a/324709/368507
要做到这一点,内核必须有utrace补丁,但我找不到最新内核的任何utrace补丁.
邮件列表已关闭,官方网站上的许多链接都已关闭.
有人知道这个项目的去向吗?它死了吗?这是否意味着我们不能再使用stap来跟踪最近内核上的可执行文件了?
谢谢
有没有办法使用这些运算符来输入和输出二进制数据?我想这样做的原因是它使代码可读。例如:infile>>filedecrypter>>metadataparser>>audiodecoder>>effects>>soundplayer;
对于冗长的帖子道歉,我在以较短的方式制定它时遇到了麻烦.此外,这可能更适合Unix和Linux Stack Exchange,但我会先在SO处尝试,因为有一个ftrace标签.
无论如何 - 我想观察用户程序的机器指令是否在完全function_graph捕获的上下文中执行ftrace.一个问题是我需要这个旧内核:
$ uname -a
Linux mypc 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
......在这个版本中,没有UPROBES- 正如3.5 [LWN.net]中的Uprobes应该能够做到这一点.(只要我不需要修补原始内核,我就会愿意尝试使用树构建的内核模块,因为User-Space Probes(Uprobes)[chunghwan.com]似乎可以证明;但是至于我可以从0看到:基于Inode的uprobes [LWN.net],2.6可能需要一个完整的补丁)
但是,在这个版本上,有一个/sys/kernel/debug/kprobes,和/sys/kernel/debug/tracing/kprobe_events; 和Documentation/trace/kprobetrace.txt意味着可以直接在地址上设置kprobe; 即使我无法在任何地方找到如何使用它的例子.
在任何情况下,我仍然不确定使用什么地址 - 作为一个小例子,假设我想跟踪程序main功能的开始wtest.c(包括在下面).我可以这样做来编译并获得一个机器指令汇编列表:
$ gcc -g -O0 wtest.c -o wtest
$ objdump -S wtest | less
...
08048474 <main>:
int …Run Code Online (Sandbox Code Playgroud) 我正试图通过llvm的opt程序(用于作业),并且教师建议设置一个断点runOnFunction.我在其中一个文件中看到了这个:
bool InstCombiner::runOnFunction(Function &F) { /* (Code removed for SO) */ }
Run Code Online (Sandbox Code Playgroud)
但是gdb似乎没有找到runOnFunction断点.我突然想到问题可能是命名空间?我试过这个,但gdb永远不会中断,它只是创建了fooOpt.s文件:
(gdb) b runOnFunction
Function "runOnFunction" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (runOnFunction) pending.
(gdb) r -S -instcombine -debug -o ~/Desktop/fooOpt.s ~/Desktop/foo.s
Run Code Online (Sandbox Code Playgroud)
我在Mac上,所以我没有objdump,但otool生产560万线,通过涉水起点似乎没有合理的runOnFunction多次出现有更多的.
我希望通过使用sed/awk预处理源文件来直接检测我的代码.我不能使用其他方法,如调试器跟踪或gcc选项-finstrument-functions.在最后一种情况下,地址以某种我无法管理的方式重新定位,我错过了与符号表的对应关系.这里介绍的其他方法(ptrace,etrace,callgraph等)或者在这里可以很好地用于一个简单的例子,但不是在我的真实项目中.
问题在于,在处理大型开源项目时,函数的编写标准不仅在C和C++文件之间不同,而且通常在同一文件中.的{可以是在参数列表的结尾,或在另一行,结构或分配可使用的起始{,制作简单功能解析假.
因此,在函数定义的开头插入宏的上述链接中提供的解决方案通常不起作用,并且通过手工代码行(KLOC)进行校正是不可行的.
sed 's/^{/{ENTRY/'
Run Code Online (Sandbox Code Playgroud)
那么,如何使用在sed或awk中使用的正则表达式可靠地定位C/C++代码中的函数定义?可能通过使用gcc预编译代码的一部分?我正在寻找一些可能在船上的东西.