我想查看如下所示的基本程序的代码流程。
#include<stdio.h>
int main ()
{
FILE *fptr = fopen("/mnt/myfilesystem/test.txt", "r");
if(fptr) {
printf("open successful\n");
fclose(fptr);
}
else
printf("open failed\n");
return 0;
}
我想查看此程序运行时执行的函数调用的完整序列。 我尝试使用 strace 和 ptrace,但它们只列出了系统调用 :( 关于如何做到这一点有什么建议吗?
提前致谢!!
最佳答案
您可以使用 gnu profiler gprof .
使用 -pg
标志编译它(main.cc):
gcc -pg main.cc -o main
然后执行它(./main
)。您的二进制文件将生成一个文件 (gmon.out
)。然后你可以使用 gprof 获取跟踪:
gprof main gmon.out
用你的例子我得到:
index % time self children called name
0.00 0.00 1/1 __do_global_ctors_aux [9]
[7] 0.0 0.00 0.00 1 global constructors keyed to main [7]
0.00 0.00 1/1 __static_initialization_and_destruction_0(int, int) [8]
-----------------------------------------------
0.00 0.00 1/1 global constructors keyed to main [7]
[8] 0.0 0.00 0.00 1 __static_initialization_and_destruction_0(int, int) [8]
这不是太多信息,因为您的应用程序并不复杂。
如果你想跟踪系统调用,试试strace ./main
。输出很长,你会看到所有的系统调用:
execve("", [""], [/* 26 vars */]) = 0
brk(0) = 0x877f000
access("", F_OK) = -1 ENOENT
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7748000
access("", R_OK) = -1 ENOENT
open("", O_RDONLY) = -1 ENOENT
open("", O_RDONLY) = -1 ENOENT
stat64("", 0xbfdc4a18) = -1 ENOENT
open("", O_RDONLY) = -1 ENOENT
stat64("", {st_mode=S_IFDIR|0755, st_size=6104, ...}) = 0
open("", O_RDONLY) = -1 ENOENT
open("", O_RDONLY) = 3
....
关于c - C中的函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9745831/