首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

gprof:如何为链接到主程序的共享库中的函数生成调用图

首先,我们需要了解gprof是什么。gprof是一个性能分析工具,用于分析程序的运行时性能,包括CPU占用率、内存使用情况等。gprof可以帮助开发人员找到程序中的性能瓶颈,并优化代码以提高程序的运行速度和效率。

要为共享库中的函数生成调用图,可以使用gprof的-b选项。具体步骤如下:

  1. 使用-pg选项编译主程序和共享库。例如:
代码语言:txt
复制
gcc -pg -o main main.c -L. -lmylib

其中,-pg选项用于启用gprof的性能分析功能,-o选项用于指定输出文件名,-L选项用于指定库文件所在的目录,-l选项用于指定要链接的库文件名。

  1. 运行主程序,生成性能分析数据文件gmon.out。例如:
代码语言:txt
复制
./main
  1. 使用gprof -b选项生成共享库中函数的调用图。例如:
代码语言:txt
复制
gprof -b main > call_graph.txt

其中,-b选项用于生成调用图,main为主程序的可执行文件名,>用于将输出重定向到文件call_graph.txt中。

  1. 使用文本编辑器打开生成的调用图文件call_graph.txt,查看共享库中函数的调用关系。

需要注意的是,gprof只能分析静态链接的库,对于动态链接的库无法生成调用图。此外,gprof只能分析C/C++语言编写的程序,对于其他语言编写的程序无法分析。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在ctypes的C共享库中调用Python函数

概述 ctypes 是Python标准库中提供的外部函数库,可以用来在Python中调用动态链接库或者共享库中的函数,比如将使用大量循环的代码写在C语言中来进行提速,因为Python代码循环实在是太慢了...使用下面的命令来将上述C文件编程成共享库my_lib.so: gcc -shared -o my_lib.so my_lib.c 这个命令会在当前目录下会生成my_lib.so。...然后在Python文件中定义这个回调函数的具体实现,以及调用共享库my_lib.so中定义的foo函数: # file name: ctype_callback_demo.py import ctypes.../my_lib.so') # 调用共享库中的foo函数 res = lib.foo(callback_func, a) print('{} > 0 = {}'.format(a,...C的float指针类型 data_p = data.ctypes.data_as(c_float_p) # 调用共享库中的foo函数 my_lib.foo(data_p) 参考 https://docs.python.org

37530

程序分析工具gprof介绍

/test 运行后,在当前目录下将生成一个文件gmon.out,这就是gprof生成的文件,保存有程序运行期间函数调用等信息。...如果源代码有多个文件,或者代码结构比较复杂,编译过程中先生成若干个目标文件,然后又由链接器将这些目标文件链接到一起,这时该怎么使用gprof呢?...要想记录每个库函数的调用情况,链接的时候必须指定库函数的动态(或者静态)链接库libc_p.a,即加上-lc_p,而不是-lc。...只有当程序从main函数中正常退出,或者通过系统调用exit()函数而退出时,才会生成gmon.out文件。而通过底层调用如_exit()等退出时不会生成gmon.out。...l         -F Name 输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。

1.6K20
  • Linux性能分析工具与图形化方法

    会产生结果分析,如图 1520928469_63_w748_h439.png 1.3 图形化方法 perf的结果可以生成火焰图。...&> perf.folded 3、最后生成svg图: /data/flamegraph.pl perf.folded > perf.svg  生成的火焰图如下: 1520928981_12_w1175..._h349.png 关于火焰图的含义及分析网上有很多文章,这里不再赘述 二、Gprof 2.1 简介 gprof用于监控程序中每个方法的执行时间和被调用次数,方便找出程序中最耗时的函数。...在程序正常退出后,会生成gmon.out文件,解析这个文件,可以生成一个可视化的报告 2.2 使用方法 使用gprof,需要在编译时,加入-pg选项 另外只有在程序正常退出后才会生成gmon.out,kill...;valgrind的结果是一条单路,指出的是某条调用路径上的时间消耗,并不是一个全局的展示。

    8.8K311

    IT项目研发过程中的利器——CC++项目调用图篇

    这个时候我们就可以借助一些工具来生成“调用图”(Call Graph)。...图中函数和模块的连线比较多,说明其被使用的很多,需要重点关注;图中函数和模块位于很多调用栈中,说明该函数是有关“脉络”的信息,也要重点关注。...它只能分析运行过的函数,对于运行没有覆盖的函数,不能分析出来。 技术流派 主要就是有哪些性能分析工具: perf。《动态分析C语言代码生成函数调用关系的利器——perf》 gprof。...《动态分析C语言代码生成函数调用关系的利器——gprof》 valgrind。《动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind》 gperftools。...《动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler》 它们细微的区别是: gprof和gperftools需要在编译时链接分析库的代码;而perf和valgrind

    74110

    linux进行c++开发经验总结

    /prog core.xxxx来还原程序挂掉前的状态 gdb常用快捷键: bt 查看堆栈 l 查看当前所处位置的源代码 b 打断的,如b filename::linenum 打断点到文件的某一行,也可以直接打到某函数位置...,找出最耗时的函数 使用: gcc -pg 选项编译 运行程序,结束后生成gmon.out gprof ..../prog gmon.out -b 查看输出 原理: 在每个函数中插入count函数,这样函数调用时就会计算次数和时间 缺点: 无法分析多线程程序;无法观察IO时间 valgrind工具 可以使用它的Memcheck...功能来进行内存检查,或者Callgrind 进行耗时和函数调用情况分析 使用: valgrind --tool=callgrind ..../prog_name 运行完会生成callgrind.out.xxx的文件 kcachegrind.exe 打开上一步生成的文件,可以看到函数运行耗时,以及调用的流程图 知道哪个函数或者哪个操作最耗时,

    1.3K20

    【嵌入式】C语言程序调试和宏使用的技巧

    gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序行。.../a.out x / y = 0 x + y = 8 x * y = 15 #expr表示根据宏中的参数(即表达式的内容),生成一个字符串。.../test deng@itcast:~/tmp$ ls gmon.out test test.c deng@itcast:~/tmp$ 使用gprof剖析主程序 deng@itcast:~/tmp...,一个是每个函数执行的时间占程序总时间的百分比,另外一个就是函数被调用的次数。...工具的时候,对于一个函数进行gprof方式的剖析,实质上的时间是指除去库函数调用和系统调用之外,纯碎应用部分开发的实际代码运行的时间,也就是说time一项描述的时间值不包括库函数printf、系统调用system

    69110

    NodeJS 性能优化之 CPU 看图篇

    ,如下表: 颜色 类型 绿色 JS代码调用 蓝色 优化编译代码 黄色 C++/C代码 红色 libuv系统调用 2.3 火焰图形状对应关系 形状 含义 每一个平面方块 一个函数在栈中的位置(也称一个栈帧...Builtin 指的是C++内置的运算方法 Stub C入口桩代码:作用是在js的JIT代码中,如果要调用Runtime的函数,则通过CEntryStub实现 V8::internal 内部命名空间,...(AST) c) 针对抽象语法树进行语义分析,构建你需要的内部数据结构或生成代码 通过局部查看火焰图分析源码 1 Stub:CEntryStub:C入口桩代码,在JS的JIT代码中,提供调用Runtime...的函数(如DOM函数或者JS的builtin函数) 2【编译builtins.h】v8::internal::Builtin_JsonParse 3【解析器json-parser.cc】v8::internal...,并能够找到哪些函数是耗时较多的 JSON序列化流程相似相似,感兴趣的同学可以看一下V8的json-stringifier.cc和对应的.h文件 三、CPU性能分析的另一种可视化dot图 3.1 需要gprof2dot

    7.8K40

    iOS逆向(5)-不知MachO怎敢说自己懂DYLD

    其中包括UIKit,Foundation等基础库。 ? ? 在源码中可以看到在我们iOS系统中,共享缓存库被明确一定会被加载。...但是有时因为共享缓存库的机制的存在使得iOS在共享缓存库里面的C函数,也就是系统C函数变的不是那么静态,有了些许OC运行时的特性! 这部分内容将会在下一篇文章着重讲解!...从不一样的角度看Runtime! 3、实例化主程序 加载主程序其实就是对MachO文件中LoadCommons段的一些列加载! 我们继续对代码的跟进,如下6张图: ? ?...4、加载动态链接库 加载动态链接库,如XCode的ViewDebug、MainThreadChecker,我们之后代码注入的库也是通过这种形式添加的! ? 5、链接主程序 ?...分别是: 1、配置环境变量 2、加载共享缓存库 3、实例化主程序 4、加载动态链接库 5、链接主程序 6、加载Load和特定的C++的构造函数方法 7、寻找APP的main函数并调用 另外dyld中LC_LOAD_DYLIB

    1.8K41

    【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

    (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态库,只是在链接时只能把函数在DLL的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib...也可以用ld命令的-l和-L参数。 共享函数库(.so文件) 共享函数库在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。...hello.h(见程序1)为该函数库的头文件。main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。...只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。...在程序3即main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。

    5.5K52

    Linux后台服务常用诊断命令和方法

    可以根据符号还原对应的函数调用名,命令空间,类名 2.1.5 反编译,反跟踪 nm 程序可用于列举符号及其类型和值, 但是,要更仔细地研究目标文件中这些命名段的内容, 需要使用功能更强大的工具。...2.2.2 ldd 显示程序需要使用的动态库和实际使用的动态库 ldd -r ....system call的调用时间 -o 将strace的输出定向到file中。...使用 -pg 编译和链接应用程序 gcc -pg -o exec exec.c 如果需要库函数调用情况: gcc -lc_p -gp -o exec exec.c 2、执行应用程序使之生成供gprof ...分析的数据gmon.out 3、使用gprof 程序分析应用程序生成的数据 gprof exec gmon.out > profile.txt 注意: 程序必须通过正常途径退出(exit()、main返回

    1.7K82

    动态分析C语言代码生成函数调用关系的利器——gprof

    gprof是一个C语言程序性能分析工具。在编译期间,我们给编译指令增加-pg选项,就可以将检测代码插入到源码中。然后使用gprof启动编译程序,它会收集程序运行的流程以及其他相关数据。...最后我们使用gprof2dot将这些数据转换成dot文件,使用graphviz进行图形化展示。 以《静态分析C语言生成函数调用关系的利器——cflow(二)》中的libevent为例。...因为我们不希望使用静态库链接的形式,所以直接编译整个源码。 主要关注的就是-pg -c选项的新增,其他的命令我们在《静态分析C语言生成函数调用关系的利器——cally和egypt》已经见过。...gprof test-time > test-time.output 数据转换 上一步gprof采集的数据分为两部分,其中一个是调用关系(Call graph) Call graph (explanation...环境准备 然后使用《管理Python虚拟环境的脚本》中的脚本构建虚拟环境,并安装gprof2dot source env.sh init source env.sh enter source env.sh

    31510

    fishhook详解

    2.3,实例化主程序:加载所有需要的Mach-O镜像文件 2.4,加载所有插入的动态库 2.5,链接主程序 2.6,链接插入的库(动态库) 2.7,主程序的初始化...2.8,调用应用程序的入口函数main函数 其中,最关键的步骤是2.7主程序的初始化: 自initializeMainExecutable函数开始,经过一系列初始化函数的调用,最终会调用到notifySingle...共享缓存机制 上面?我回顾的dyld的加载流程中,在dyld::_main函数中做的第二步就是加载共享缓存库。共享缓存库是什么呢?...也就是说,DYLD会将machO与动态库链接起来,生成一个最终的完整的可执行程序。 我们的Mac电脑上也是有共享缓存库的,路径为/private/var/db/dyld,如下: ?...只有在程序运行的时候,通过DYLD动态链接到共享缓存库,此时才可以知道具体函数在动态缓存库中的地址。

    1.5K10

    Valgrind 使用入门

    工具简介: Valgrind 是一套类似于 gprof 的动态检测的工具集,由于使用方便,不需修改目标程序源码,输出清晰图文并茂等优势,常被用作后台(特别是linux后台)服务内存泄漏检测、性能打点、竞态检测等...也没指针指向该内存(首地址); indirectly lost: 间接内存泄漏,比如结构体中定义的指针指向的内存无法回收; possibly lost: 可能出现内存泄漏,比如程序退出时,没有指针指向一块内存的首地址了...最严重的是 definitely lost 和 indirectly lost,检测结果文件中已给出了具体函数和源文件。...文件的效果: 左边列出了调用parts、调用栈 cost 排序等,右边列出了所有调用者、被调用者以及调用图等。...Self表示自身执行的耗时,Incl表示包含调用函数的总耗时,选择感兴趣的函数,在右边可查看该函数的调用关系图: i.

    7.9K00

    Go Plugin 浅析

    Go Plugin 浅析 go plugin 支持将 go包 编译为共享库 的形式单独发布,主程序可以在运行时动态加载这些编译为动态共享库文件的 go plugin,从中提取导出 变量 或 函数 的符号并在主程序的包中使用...主程序通过 plugin 包加载 动态库 并提取 动态库文件 中的符号的过程与C语言应用运行时加载动态链接库并调用库中函数的过程如出一辙。下面我们就来看一个直观的例子。...一旦 Lookup 成功,我们便可以将符号通过 类型断言 获取到其真实类型的实例,通过这些 实例 (变量 或 函数),我们可以调用 plugin 中实现的逻辑。...按照官方文档的说法:“当一个插件第一次被open时,plugin中所有不属于主程序的包的init函数将被调用,但一个插件只被初始化一次,而且不能被关闭”。...soname的关键功能是它提供了兼容性的标准,当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。

    1.2K20

    静态链接库和动态链接库的区别

    动态库而言:某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。...只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名(是mymath 而不是libmymath.a ),gcc将会从静态库中将公用函数连接到目标文件中...在程序main.c中,我们包含了静态库的头文件add.h和sub.h,然后在主程序main中直接调用公用函数add()和sub()即可。2.5、生成目标程序main,然后运行....3.2、隐式方式使用动态库在程序中隐式使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。...如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址

    8.4K21

    一个函数的自白

    内存容量是受限的,需要考虑一个函数在内存中所需要处理和生成的数据量。内存中没有变量名或签名的内存地址,只有以数字表示的内存地址。...把我们有组织的固定下来充分复用——插件 但要前尘减 无妨外相同 如果把我们有组织的固定下来,所有或部分被预编译后通常会自成一体,主程序和每个包单独编译,主程序在开始时动态地加载这些包,使用动态加载包中的函数和对象...这种异常处理在函数调用链中位于较上层,仅在程序最外层进行异常处理,无视异常时间发生的位置。...无论在哪里捕获异常,调用栈都是异常信息的一部分,除非局部存在有意义的处理方式,更好的做法是将异常返回到函数调用链的上游。...首先是隔离,核心函数不要有任何副作用,所有IO行为都最好和纯粹的函数明确区分开来,所有包含IO的函数最好从主程序中调用。

    77250

    性能优化之动态加载

    动态链接的一个典型应用就是动态链接库。动态链接库是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。 动态链接库是从C语言函数库和Pascal库单元的概念发展而来的。...另一个方便之处是对动态链接库中函数的修改可以自动传播到所有调用它的程序中,而不必对程序作任何改动或处理。...,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。...需要被更新的功能模块被封装在动态连接库中,主程序利用LoadLibrary函数装载该动态链接库,然后调用其中的功能模块。...如果一个模块在运行中要调用到另一模块中的函数,而在没有调用这个模块中的其它函数之前,不会把该模块加载到系统中(也就是内存映射)。

    10910
    领券