Gdb 在应用程序中进行的所有函数调用的列表

Gdb 在应用程序中进行的所有函数调用的列表,gdb,callstack,gprof,Gdb,Callstack,Gprof,我们如何列出应用程序中调用的所有函数。我尝试使用GDB,但它的回溯列表仅限于主函数调用 我需要更深入的列表,即主函数调用的所有函数的列表,以及从这些被调用函数调用的函数的列表,等等 有没有办法在gdb中实现这一点?或者,你能给我一些建议吗?你想要一个调用图。您想要使用的工具不是gdb,而是gprof。您可以使用-pg编译程序,然后运行它。当它运行一个文件时,gmon.out将被生成。然后使用gprof处理此文件并享受输出 如何列出应用程序中调用的所有函数 对于任何实际大小的应用程序,此列表将有数

我们如何列出应用程序中调用的所有函数。我尝试使用GDB,但它的回溯列表仅限于主函数调用

我需要更深入的列表,即主函数调用的所有函数的列表,以及从这些被调用函数调用的函数的列表,等等


有没有办法在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开始的非系统函数。使用任何工具:可能的