一、静态分析工具

cppcheck

cppcheck主要用于对C/C++源代码进行分析检查的一个开源工具,可以用来检测未使用的变量、越界访问、内存泄漏等问题。

使用方法

cppcheck --enable=all NAME.cpp

gcov

gcov是伴随gcc发布的一个代码覆盖率检查工具,可以用来检查代码中各个语句的执行次数,查看代码执行逻辑,方便后期对代码的优化。

使用方法

  1. 在gcc/g++的编译选项中添加两个选项 -fprofile-arcs -ftest-coverage
  2. 运行可执行程序,生成两个包含代码覆盖信息的两个文件 .gcno .gcda
  3. 执行命令 gcov NAME.cpp 会生成包含代码执行次数的信息的文件NAME.cpp.gcov;通过该文件可以查看每行代码的调用次数

ldd

ldd命令可以查看当前可执行程序(或者动态库)需要依赖哪些动态库,以及缺少哪些动态库。ldd -r还可以报告缺少的目标对象和函数

使用方法

ldd FILENAME

对于引用第三方动态库的程序在运行的时候提示找不到对应的动态库,通常是因为动态库并未在ld.config文件中写明的路径,且在链接的过程中使用了 -L PATH_DIR -lNAME 这样显示指明动态库位置的选项,readelf -d FILENAME 查看调用动态库的位置。解决问题的方式是:

  1. 链接的时候配合使用 -Wl,-rpath=PATH_DIR 和 -L PATH_DIR 两个参数选项,保证程序在链接、运行期间能够正确找到动态库的位置(-Wl,-rpath是在运行时起作用,-L是在链接时起作用;另外,如果PATH_DIR是相对路径,在使用-rpath的时候需要使用ORIGIN这个宏,例如-Wl,-rpath='$$ORIGIN/lib' 这个选项就是说,运行的时候在可执行文件所在目录的lib子目录中寻找动态库)。
  2. 将动态库所在的目录添加到/etc/ld.config文件中,然后执行 ldconfig 刷新缓存(这种方式不建议使用)。

file

file命令可以查看文件的类型,对于可执行文件或者动态库,可以查看是否需要链接动态库,同时也可以查看是否包含符号表(调试用,可以通过strip去除)

使用方法

file FILENAME

nm

nm命令用于列出目标文件中的符号,可以通过-C选项来显示可读的符号形式,-D选项显示动态符号,-u显示未定义的symbol(通常在其他文件中定义)。通常情况下,对于链接问题可以通过nm命令的-D -u选项来查看先关的符号。

使用方法

nm -CDu FILENAME

strip

strip用来清理共享库或可执行文件中的符号信息和调试信息,通常是程序正式发布前进行。

readelf

readelf主要用来查看头信息,符号信息,动态重定位信息等elf内部的各个部分。

readelf -s SONAME | grep FUNC_NAME 用来查看动态库SONAME中是否包含FUNC_NAME(注:如果是c++的话,函数名会被编码成类似_ZN4hoot3Log11getInstance 这样子, 这种情况下,建议采用nm -CD 命令选项来进行函数的查找)

二、调试跟踪工具

gdb

gdb是Linux环境下最强大的调试工具,可以调试未运行的程序或者正在运行的程序,还可以分析程序崩溃的coredump文件,这些的前提是,程序在编译时添加了-g选项打开了调试信息。由于gdb功能过于强大,这里就不多做介绍,回头专门写一篇相关的博文。

使用方法

gdb FILENAME #对于有参数的,可以通过gdb内执行 set args PARAM 来设置参数

gdb attach PID #直接挂载PID进程,此时进程会停止运行,需要命令c来继续运行

gdb FILENAME CORENAME #分析FILENAME程序产生的coredump文件

strace

strace可以跟踪并显示用户程序中的系统调用的详细信息(参数、返回值、系统调用耗费时间等)。适用于可执行程序或者运行中的进程,用户可以观察程序的运行状态。

使用方法

strace FILENAME

strace -p PID

|常用选项 | 含义 |

|----- | ----|

|-c |统计每次调用的时间、次数等信息|

|-f |跟踪fork产生的子进程 |

|-tt |输出的每行内容前添加时间信息|

|-T |显示每次调用耗费的时间 |

|-e |后接相关的系统调用方法,只显示特定类型的调用信息|

pstack

查看进程的实时堆栈信息 pstack PID

valgrind

valgrind通常被用于程序内存泄漏检查,同时它还有程序性能分析的功能(用得少)。

使用方法

valgrind --leck-check=full FILENAME

三、性能分析工具

perf

perf是随Linux内核代码一起发布的性能诊断工具可以用来分析应用程序或者内核代码性能。perf对单个程序做函数调用次数、上下文切换次数、中断次数等信息进行统计。

使用方法

perf stat FILENAME #统计程序FILENAME的运行信息

perf top #查看系统中各个进程的资源占用率(可以通过-e选项来观察指定类型的运行数据)

perf record FILENAME; perf report #这两个命令组合使用,第一个命令将统计信息写入到文件中,第二个命令从文件中读取统计信息,然后展示出来

gprof

gprof与perf功能类似,也是主要用户程序性能分析。使用gprof要求在编译链接的时候,添加-pg选项,然后执行程序,会生成包含性能统计信息的gmon.out文件,然后再使用gprof分析这个gmon.out文件来读取程序相关的性能信息。gprof默认在程序结束的时候才会生成性能统计信息,因此如果想分析一个长期运行的程序,需要加入信号处理函数来让程序调用exit主动退出而不是Ctrl C强制退出(这样不会产生统计信息)

使用方法

gprof FILENAME gmon.out

火焰图

配合perf或者gprof使用,将性能统计信息可视化,方便用户分析。

C/C++调试分析工具的更多相关文章

  1. 调试分析工具 (C/C++)

    一.静态分析工具 cppcheck cppcheck主要用于对C/C++源代码进行分析检查的一个开源工具,可以用来检测未使用的变量.越界访问.内存泄漏等问题. 使用方法 cppcheck --enab ...

  2. CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析

    0x01 2013 Pwn2Own 黑客大赛 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题 ...

  3. 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  4. KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  5. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  6. Linux性能分析工具的安装和使用

    转自:http://blog.chinaunix.net/uid-26488891-id-3118279.html Normal 0 7.8 磅 0 2 false false false EN-US ...

  7. 日志分析工具ELK配置详解

    日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...

  8. [原创]推荐一款强大的.NET程序内存分析工具.NET Memory Profiler

    [原创]推荐一款强大的.NET程序内存分析工具.NET Memory Profiler 1 官方网站:http://memprofiler.com/2 下载地址:http://memprofiler. ...

  9. 两款HTTP流量分析工具HttpWatch与Fiddler的比较(转)

    最近突然想看看HTTP的消息到底是怎么回事,在网上搜了几款软件来监控,并且搜到了下面的文章,感觉介绍的不错,就copy下来了.下文摘自:http://www.imkevinyang.com/2009/ ...

随机推荐

  1. 单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out

    mxc_vpu_test.out是飞思卡尔为IMX6Q编写的VPU示例程序,有编解码和简单的网络传输功能. 首先从/opt/freescale/pkgs/中提取出imx-test-3.0.35-4.1 ...

  2. 解析MYsql explain执行计划extra列输出

    EXPLAIN Extra 列信息: explain Extra列输出包含了关于mysql如何解决query的额外信息,特别是出现Using filesort 和 using temporary时,应 ...

  3. redux学习日志:关于react-redux

    首先先强调一句:一定要多读官方文档,而且要精读,否则你会忽略掉很多东西! 一,Provider 刚开始看的时候,大致浏览了一下,知道了这个组件是能够接收store作为它的属性,然后它里面的子组件就可以 ...

  4. programing

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  5. RocketMQ-Tomcat中部署rocketmq-console

    1. https://github.com/didapinchegit/rocket-console 在github上下载rocketmq-consoler的源码, 用mvn clean packag ...

  6. python_如何判断字符串a以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...

  7. 在CMainFrame里使用定时器是有讲究的

    设置定时器函数:SetTimer 单位毫秒 销毁定时器函数:KillTimer 消息:WM_TIMER 注意事项: (1)不要在构造函数里设置定时器. (2)不要在析构函数里销毁定时器. 原因:构造函 ...

  8. 转-Windows路由表配置:双网卡路由分流

    原文链接:http://www.cnblogs.com/lightnear/archive/2013/02/03/2890835.html 一.windows 路由表解释 route print -4 ...

  9. springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  10. Mac 管理员变为了普通用户怎么办?

    开机的时候一直按住 command+s 出现命令行终端的时候按照以下顺序输入命令: /sbin/mount -uw    回车rm var/db/.AppleSetupDone   回车 reboot ...