我正在寻找像ltrace或strace这样的工具,它可以跟踪可执行文件中的本地定义函数.ltrace仅跟踪动态库调用,而strace仅跟踪系统调用.例如,给定以下C程序:
#include <stdio.h>
int triple ( int x )
{
return 3 * x;
}
int main (void)
{
printf("%d\n", triple(10));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行程序ltrace将显示调用,printf因为这是一个标准库函数(我的系统上是一个动态库),strace并将显示启动代码,用于实现printf的系统调用和关闭代码的所有系统调用,但我想要一些能告诉我函数triple被调用的东西.假设优化编译器没有内联本地函数,并且二进制文件没有被剥离(符号被删除),是否有工具可以做到这一点?
编辑
几点澄清:
我们如何列出应用程序中调用的所有函数.我尝试使用GDB,但它的回溯列表只能到主函数调用.
我需要更深的列表,即主函数调用的所有函数的列表以及从这些调用的函数调用的函数等等.
有没有办法在gdb中得到它?或者你能给我一些关于如何获得这个的建议吗?
我一直试图找到一种方法来自动化GDB中跟踪程序控制流程的进度.
即使只是一种自动执行n命令的简单方法,您也可以查看调用例程的顺序.
我意识到你可以发出n xx是GDB逐步执行的次数的问题,但问题在于它显示的是命令而不是例程的地址!但是如果你n在GDB中手动按下(然后按回车键发出上一个命令),它会显示地址.
我在GDB中尝试了以下内容:
(after setting a breakpoint at say 0x0123456)
b *0x0123456
Run Code Online (Sandbox Code Playgroud)
GDB说<breakpoint 1 at 0x123456>.我键入:
commands 1
n 1000
c
end
Run Code Online (Sandbox Code Playgroud)
但它没有按预期循环,也没有显示地址位置:-(.
任何帮助,将不胜感激!当然必须简单的自动登录命令例程被调用??
我想知道我们是否可以在任何C或C++应用程序中启用跟踪.
例如,使用gcc选项或小工具,我将启用跟踪,并在控制台上打印跟踪或转储到文件.
由于有很多文件和函数/类,我不想手动开始添加跟踪打印.
如果此类工具不可用,则下一步选择使用脚本并尝试在跟踪打印时添加.
strace 没有多大用处,因为它主要给出了系统调用.