一、静态分析工具

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. Web API (四) 特性路由(Attribute Route)

    特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...

  2. Mybatis延迟加载和查询缓存

    摘录自:http://www.linuxidc.com/Linux/2016-07/133593.htm 阅读目录 一.延迟加载 二.查询缓存 一.延迟加载 resultMap可以实现高级映射(使用a ...

  3. JavaScript ES6 let、const

    在ES6中,增加了2个声明变量的关键字:let 和 const.在这里将详细介绍let与var的区别.Babel对let的处理以及const的简单使用. 1. let 在ES6规范中增加了 let 关 ...

  4. Linux指令--ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  5. 20165220 学习基础和C语言基础调查

    # # # # 我觉得我打游戏(不知道算不算一技之长)毕竟从小学一年级就接触到了各种形形色色的游戏,讲道理其实我的游戏天赋毕竟还是很大的,从意识到感觉我觉得都比大多数人好一些,其实吧打游戏打得好也是很 ...

  6. SQL查询语句优化的实用方法

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...

  7. spring的jar各包作用

    http://yjwen337.blog.163.com/blog/static/3625847820106132949858/[转]spring.jar是包含有完整发布的单个jar 包,spring ...

  8. 00_HTML入门第一天

    HTML入门 body标记的常见属性:bgcolor 设置背景颜色:text 设置文本颜色:link 设置链接颜色:vlink 设置已经访问了的链接颜色:alink 正在点击的链接颜色: meta是单 ...

  9. awk的sub函数和gsub函数的用法

    1. sub函数 [root@nhserver1 10]# echo "a b c 2011-11-22 a:d" | awk 'sub(/-/,"",$4)' ...

  10. jsBOM内容

    正如我们所知道的,javascript分为三大块,ECMAscript,BOM,DOM,ECMAscript固然重要:可是在web中使用ECMAscript很大程度上需要了解BOM即浏览器对象模型,否 ...