C语言中的函数调用序列

Ven*_*nom 0 c debugging gcc

我想看一下基本程序的代码流程,如下所示.

#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,但他们只列出系统调用:(关于如何做到这一点的任何建议?

提前致谢 !!

per*_*eal 5

你可以使用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)