一、静态分析工具

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. 写PPT的先扬后抑的思路

    近期给一个客户做IT战略规划. 基本结束了,客户要求写点有高度的东西.我想也是,尽管眼下的PPT也触及到战略和行业的问题,可是没有总结出来.于是就挖空心思,琢磨了三天.写了4页PPT.改动了几遍.还算 ...

  2. Linux_Shell初级编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  3. 全双工 串口 stm32

  4. 9.6 Binder系统_驱动情景分析_server的多线程实现

    当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...

  5. 基于mpvue的小程序项目搭建的步骤一

    未标题-1.png mpvue 是美团开源的一套语法与vue.js一致的.快速开发小程序的前端框架,按官网说可以达到小程序与H5界面使用一套代码.使用此框架,开发者将得到完整的 Vue.js 开发体验 ...

  6. jQuery常用方法(持续更新)(转)

    0.常用代码: 请容许我在1之前插入一个0,我觉得我有必要把最常用的代码放在第一位,毕竟大部分时间大家都是找代码的. (1)AJAX请求 $(function() { $('#send').click ...

  7. pstack.sh 改进版

    pstack.sh 改进版本 #!/bin/bash if (( $# < 1 )) ; then echo "usage: `basename $0` pid" 1> ...

  8. php实现用短路求值原理求1+2+3+...+n(短路求值是什么)(仔细分析题干)

    php实现用短路求值原理求1+2+3+...+n(短路求值是什么)(仔细分析题干) 一.总结 1.仔细分析题干,找出要点:该递归还是得递归啊 2.短路求值原理:&&就是逻辑与,逻辑与有 ...

  9. Android RadioGroup的RadioButton 选择改变字体颜色和背景颜色

    RadioGroup <RadioGroup android:id="@+id/client_charge_radiogroup" android:layout_width= ...

  10. Java中String推断相等equals与==的差别以及StringBuilder的equals

    Java中String类型具有一个equals的方法能够用于推断两种字符串是否相等,可是这样的相等又与运算符==所推断的"相等"有所不同,接下来进行分析,结论由程序进行验证 Str ...