我想看一下基本程序的代码流程,如下所示.
#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;
}
Run Code Online (Sandbox Code Playgroud)
我希望看到运行该程序时执行的完整函数调用序列.我尝试使用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]
Run Code Online (Sandbox Code Playgroud)
这个信息不多,因为您的应用程序并不复杂.
如果要跟踪系统调用,请尝试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
....
Run Code Online (Sandbox Code Playgroud)