一、静态分析工具

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. loadrunner--log的使用总结

    1.log的设置方式.在 runtime setting中可以设置log的生成方式:默认的log方式:Enable logging选中,log option是Send messages only wh ...

  2. report_timing_requirement

    report_timing_requirement   -ignored 会报告set_faults_paths,set_multi_path等

  3. jquery weui日期选择控件添加取消按钮

    如图: 上图是jQuery weui的时间选择控件,红框处本来应该有个“取消”按钮的,可惜偏偏没有,当用户不想选择的时候就不好处理,虽然插件提供了点击其他区域关闭的功能,但过于隐晦,不容易发现,因此本 ...

  4. RISC-V工具链环境(基于Debian/Linux操作系统)

    RISC-V工具链环境(基于Debian/Linux操作系统) 提要 Debian/Linux虚拟机导入 启动虚拟机 SiFive/Nuclei SDK运行指南 Debian/Linux虚拟机存储位置 ...

  5. VC和MATLAB混合开发经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 前期准备: 1.请确认机器中已经安装Matlab主程序或(MCR)MATLAB Compiler Runtime(具体 ...

  6. [慕课笔记]mongodb入门篇

    一:对mongodb有一个系统的完备的了解,只有概念清楚了,才能更好的使用 二:学会mongodb数据库的搭建 首先:了解如何部署数据库的服务 搭建简单的单机服务到搭建具有冗余容错功能的复制集再到搭建 ...

  7. 随手可得的Application对象

    在Android的开发其中,Application和Context对象应该是我们接触最多的对象了,特别是Context对象. 当我们在某个Activity或者Service其中时,因为它们本身就是Co ...

  8. div宽度设置width:100%后再设置padding或margin超出父元素的解决办法

    div宽度设置width:100%后再设置padding或margin超出父元素的解决办法 一.总结 一句话总结:直接加上box-sizing:border-box;即可解决上述问题. 1.box-s ...

  9. 使用Verdi理解RTL design

    使用Verdi理解RTL design 接触到一些RTL代码,在阅读与深入理解的过程中的一些思考记录 协议与设计框图 认真反复阅读理解相关协议与设计框图,一个design的设计文档中,设计框图展示了这 ...

  10. ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

    一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void ...