Gdb 在应用程序中进行的所有函数调用的列表
我们如何列出应用程序中调用的所有函数。我尝试使用GDB,但它的回溯列表仅限于主函数调用 我需要更深入的列表,即主函数调用的所有函数的列表,以及从这些被调用函数调用的函数的列表,等等Gdb 在应用程序中进行的所有函数调用的列表,gdb,callstack,gprof,Gdb,Callstack,Gprof,我们如何列出应用程序中调用的所有函数。我尝试使用GDB,但它的回溯列表仅限于主函数调用 我需要更深入的列表,即主函数调用的所有函数的列表,以及从这些被调用函数调用的函数的列表,等等 有没有办法在gdb中实现这一点?或者,你能给我一些建议吗?你想要一个调用图。您想要使用的工具不是gdb,而是gprof。您可以使用-pg编译程序,然后运行它。当它运行一个文件时,gmon.out将被生成。然后使用gprof处理此文件并享受输出 如何列出应用程序中调用的所有函数 对于任何实际大小的应用程序,此列表将有数
有没有办法在gdb中实现这一点?或者,你能给我一些建议吗?你想要一个调用图。您想要使用的工具不是gdb,而是
gprof
。您可以使用-pg
编译程序,然后运行它。当它运行一个文件时,gmon.out
将被生成。然后使用gprof
处理此文件并享受输出
如何列出应用程序中调用的所有函数
对于任何实际大小的应用程序,此列表将有数千个条目,这可能会使其变得无用
您可以使用nm
命令查找应用程序中定义(但不一定调用)的所有函数,例如
nm /path/to/a.out | egrep ' [TW] '
您还可以使用GDB在每个函数上设置断点:
(gdb) set logging on # collect trace in gdb.txt
(gdb) set confirm off # you wouldn't want to confirm every one of them
(gdb) rbreak . # set a breakpoint on each function
一旦继续,将为调用的每个函数命中一个断点。使用禁用
和继续
命令向前移动。我不相信有一种简单的方法可以自动执行,除非您想使用Python脚本
已经提到的
gprof
是另一个很好的选择。这个问题可能需要澄清,以决定目前的两个答案。取决于您需要什么:
1) 您需要知道每个函数在与#个调用匹配的函数的直接列表/图形格式中被调用的次数。如果您的代码不是过程性的(即,函数调用分支结构中的其他函数时,不会对调用的内容产生歧义),则这可能会导致不明确/不确定的结果。这是gprof的基本功能,需要使用-pg标志重新编译
2) 您需要按调用顺序列出函数,这取决于您的程序,它是最佳/可行的选项:
a) 如果您的程序运行和终止时没有运行时错误,您可以使用gprof来实现此目的。
b) 上面使用带有日志记录和断点的dbg的ELSE选项是我在阅读本文时学到的剩余选项
3) 您不仅需要知道顺序,还需要知道每个调用的函数参数。我目前的工作是粒子输运物理的模拟,所以这绝对有助于追踪异常结果的来源。。。i、 当争论被传开时,就失去了意义。我想其中一种方法是改变俄罗斯人的做法,除了使用以下方法:
(gdb)信息参数
用每个断点(在每次函数调用时设置)记录此命令的结果,给出当前函数的参数。记录函数调用历史记录 如果您是为数不多(2015年)拥有支持(英特尔PT,
/proc/cpuinfo
中的英特尔PT)的CPU的人之一,这应该是一个很好的硬件加速可能性
GDB文档声称它可以产生如下输出:
(gdb) list 1, 10
1 void foo (void)
2 {
3 }
4
5 void bar (void)
6 {
7 ...
8 foo ();
9 ...
10 }
(gdb) record function-call-history /ilc
1 bar inst 1,4 at foo.c:6,8
2 foo inst 5,10 at foo.c:2,3
3 bar inst 11,13 at foo.c:9,10
在使用它之前,您需要运行:
start
record btrace
在这一点上,无能力的CPU会出现以下故障:
Target does not support branch tracing.
CPU支持将在以下位置进一步讨论:
相关线程:
对于嵌入式,您还考虑了JAG和支持ARM的硬件,但x86的支持似乎不太好:
注意:这也将在代码之前运行,代码在<代码>之前开始<代码>:GDB已经进入100% CPU,因为我输入了命令<代码> RStur.<代码>没有日志记录,<代码>设置高度0 将是有益的。(输出无分页)您可以尝试rbreak^s[^@]*$
如果您只想在非系统函数上设置断点,即排除malloc
,strlen
&co.@Johannes,我想您需要在^
之后删除s
-我得到的只是从s开始的非系统函数。使用任何工具:可能的