首页
学习
活动
专区
工具
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

25530

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

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.5K311

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

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

13910

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.2K20

【嵌入式】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

63310

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.5K40

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.7K41

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程序看看结果如何。

3.7K52

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

9310

Valgrind 使用入门

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

7.6K00

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.4K10

Go Plugin 浅析

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

71820

静态链接和动态链接区别

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

7.9K21

一个函数自白

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

74650

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.1K100
领券