一、静态分析工具

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. Spring+Struts2+Hibernate的整合

    这篇主要采用Maven搭建Spring+Struts2+Hibernate的整合项目,复习一下SSH框架,虽然spring提供自己的MVC框架, 但是Spring也提供和其他框架的无缝整合,采用组件形 ...

  2. 【Codeforces Round #445 (Div. 2) C】 Petya and Catacombs

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看时间戳为i的点有哪些. 每次优先用已经访问过的点. 如果不行就新创一个点. 注意新创点的时间戳也是i. [代码] #includ ...

  3. 【AtCoder Beginner Contest 074 D】Restoring Road Network

    [链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...

  4. docker安装及问题处理

    1.在Ubuntu的命令行中输入 sudo apt-get install docker.io 2.如果切换到了root用户下 apt-get install docker.io 3.对于新安装的Ub ...

  5. Source Insight 3.50.0065使用详解

    转自calvinlee1984 Subject:Source Insight3.50.0065使用详解 Date:     21-Oct-2011 By:         Calvinlee1984@ ...

  6. 关于C语言的书

    我想横着走,,哈哈哈哈

  7. UVA 11374 Airport Express SPFA||dijkstra

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. jQuery插件AjaxFileUpload实现ajax文件上传时老是运行error方法 问题原因

    今天在用jQuery插件AjaxFileUpload实现ajax文件上传时,遇到一个问题,如图: 老是运行error.无法运行succes方法,追踪ajaxfileupload.js源代码发现: wa ...

  9. 超链接a的download属性 实现文件下载功能

    今天做项目遇到一个要点击按钮下载文件的功能. 百度之 知道了a的download属性.这是HTML5的新特性.主要功能是实现下载功能.主要语法是 <a href="url" ...

  10. 【u247】生物进化

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在一片茂密的原始森林中,生物学家们发现了几种远古时期的动物化石.他们将化石依次编号为1,2,3,--n ...