c - C中的函数调用顺序

标签 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;
}

我想查看此程序运行时执行的函数调用的完整序列。 我尝试使用 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/

相关文章:

将多核合并为单核处理,在 linux 上,可能吗?

c - 这个 C 结构体如何翻译成 Ada

c - 如何找到目标文件之间的依赖关系?

c++ - 奇怪的编译器行为

c++ - 我可以停止 GCC 将标准库名称包含到全局 namespace 中吗?

无法以附加或写入模式打开文件

debugging - 在 Visual Studio 2005 中检查 std::stringstream 的值

python - 在 Python 中检查 __debug__ 和其他一些条件

c# - 如何轻松地从编译中排除某些代码行?

linux - 导入错误 : No module named 'libstdcxx' when starting Eclipse debugger