首页
学习
活动
专区
工具
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++语言编写的程序,对于其他语言编写的程序无法分析。

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

相关·内容

在ctypesC共享调用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,...Cfloat指针类型 data_p = data.ctypes.data_as(c_float_p) # 调用共享foo函数 my_lib.foo(data_p) 参考 https://docs.python.org

35530

程序分析工具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.7K311

    IT项目研发过程利器——CC++项目调用

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

    44210

    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

    68310

    NodeJS 性能优化之 CPU 看图篇

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

    7.7K40

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

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

    1.8K41

    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.6K82

    【一站式解惑】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程序看看结果如何。

    5K52

    动态分析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

    26110

    Go Plugin 浅析

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

    1.1K20

    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

    静态链接和动态链接区别

    动态而言:某个程序在运行调用某个动态链接库函数时候,操作系统首先会查看所有正在运行程序,看在内存里是否已有此库函数拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。...只需要在使用到这些公用函数源程序包含这些公用函数原型声明,然后在用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.3K21

    一个函数自白

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

    77150

    Python优化第一步: 性能分析实践

    : 整个过程一共有197个函数调用被监控,其中192个是原生调用(即不涉及递归调用) 总共执行时间为0.002秒 结果列表是按照标准名称进行排序,也就是按照字符串打印方式(数字也当作字符串) 在列表...: ncalls表示函数调用次数(有两个数值表示有递归调用,总调用次数/原生调用次数) tottime是函数内部调用时间(不包括他自己调用其他函数时间) percall等于 tottime/ncalls...分析数据可视化 gprof2dot Gprof2Dot可将多种Profiler数据转成Graphviz可处理图像表述。配合dot命令,即可得到不同函数所消耗时间分析。...具体使用方法详见: https://github.com/jrfonseca/gprof2dot 因此我们可以利用它来为我们程序生成分析: gprof2dot -f pstats mkm_run.prof...同一个函数,运行时间从0.106秒降到了0.061秒效率提升近了40%! 看一下函数调用关系: ?

    1.2K100
    领券