LinuxZone

LinuxZone.net
Linux系统网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

Linux下的仿真调试工具--Valgrind工具分析器

2023年5月14日 234点热度

Valgrind简介

Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合。

高桥浩和linux内核精髓精通linux内核必会的75个绝_windbg 内核调试_linux 内核调试

Valgrind工具女包含多个工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massif。

Memcheck工具

Memcheck工具是Valgrind中最常用的工具,拿来检查程序中出现的显存问题。它能检查如下问题:

Cachegrind工具

Callgrind搜集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache模拟。在运行结束时,它会把剖析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的方式。

Helgrind工具

它主要拿来检测多线程程序中出现的竞争问题。Helgrind找寻显存中被多个线程访问,而又没有一贯加锁的区域linux驱动下载,这种区域常常是线程之间丧失同步的地方,并且会造成无法开掘的错误。Helgrind实现了名为”Eraser”的竞争检查算法,并做了进一步改进,降低了报告错误的次数。

Callgrind工具

它模拟CPU中的一级缓存I1,D1和L2二级缓存,就能精确地强调程序中cache的遗失和命中。假如须要,它还能否为我们提供cache遗失次数,显存引用次数,以及每行代码,每位函数,每位模块,整个程序形成的指令数。这对优化程序有很大的帮助。

Massif工具

堆栈剖析器,它能检测程序在堆栈中使用了多少显存,告诉我们堆块,堆管理块和栈的大小。

Massif能帮助我们减小显存的使用,在带有虚拟显存的现代系统中,它还能否加速我们程序的运行,降低程序逗留在交换区中的概率。

Valgrind由内核(core)以及基于内核的其他调试工具组成。其基于仿真方法对程序进行调试,它先于应用程序获取实际处理器的控制权linux命令行和shell脚本编程宝典,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,因而对应用程序的运行进行监视。

高桥浩和linux内核精髓精通linux内核必会的75个绝_linux 内核调试_windbg 内核调试

应用程序并不晓得该处理器是虚拟的还是实际的,早已编译成二补码代码的应用程序并不用重新进行编译,Valgrind直接解释二补码代码促使应用程序基于它运行,因而才能检测显存操作时可能出现的错误。所以在Valgrind下运行的程序运行速率要慢得多,但是使用的显存要多得多。因而,最好在性能好的机器上使用Valgrind,而且是在开发调试阶段使用。

Valgrind安装

Valgrind的安装方法很简单。我们首先查看一下我们的系统中有没有Valgrind:

linux 内核调试_高桥浩和linux内核精髓精通linux内核必会的75个绝_windbg 内核调试

其实,我们这儿的系统中没有Valgrind,按提示输入如下命令安装即可:

sudo apt install valgrind

另外,也可以通过下载源码编译、安装。

源码地址:

下载源码的命令:

wget http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

Valgrind使用

打算一个有显存泄露、内存越界问题的demo进行测试。为了便捷,我们使用官方提供的一个精典的测试demo:

valgrind_test.c:

#include 
void f(void)
{
    int* x = malloc(10 * sizeof(int));
    x[10] = 0;        // problem 1: heap block overrun
}                     // problem 2: memory leak -- x not freed
int main(void)
{
    f();
    return 0;
}

这份代码存在两个问题:

下边一上去使用valgrind的Memcheck工具来检查这份程序。

首先,我们使用-g编译程序以包含调试信息,便于Memcheck的错误消息包含准确的行号。

gcc -g valgrind_test.c -o valgrind_test

使用valgrind检查valgrind_test程序:

valgrind --leak-check=yes ./valgrind_test

我们可以用--tool参数指明使用的工具,如:

--tool=memcheck

若果不明晰设置--tool参数,则valgrind的测量工具默认使用的是Memcheck工具。--leak-check=yes选项打开详尽的显存泄露检查器。

我们执行检查工具以后的结果如:

linux 内核调试_windbg 内核调试_高桥浩和linux内核精髓精通linux内核必会的75个绝

==7407== Memcheck, a memory error detector
==7407== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==7407== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==7407== Command: ./valgrind_test
==7407== 
==7407== Invalid write of size 4
==7407==    at 0x108668: f (valgrind_test.c:6)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407==  Address 0x522d068 is 0 bytes after a block of size 40 alloc'd
==7407==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==    by 0x10865B: f (valgrind_test.c:5)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407== 
==7407== 
==7407== HEAP SUMMARY:
==7407==     in use at exit: 40 bytes in 1 blocks
==7407==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==7407== 
==7407== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7407==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==    by 0x10865B: f (valgrind_test.c:5)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407== 
==7407== LEAK SUMMARY:
==7407==    definitely lost: 40 bytes in 1 blocks
==7407==    indirectly lost: 0 bytes in 0 blocks
==7407==      possibly lost: 0 bytes in 0 blocks
==7407==    still reachable: 0 bytes in 0 blocks
==7407==         suppressed: 0 bytes in 0 blocks
==7407== 
==7407== For counts of detected and suppressed errors, rerun with: -v
==7407== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

输出结果包含有好多信息,我们可以很容易查看到了关键的信息:

其中,输出信息告诉我们无效地写入了4个字节,而且提示了可能出现问题的代码行数。堆栈跟踪告诉我们调用了一次malloc申请显存,但并没有free,但是强调了在那里分配了显存。

另外linux 内核调试,这儿的7407表示的是进程ID号。

显存泄露有几种类型,最重要的两类是:

其中,明晰的泄露必需要进行修补。

以上就是关于valgrind最常用的Memcheck工具的简单使用介绍,使用Memcheck工具有时侯我们可以很清楚地测量出程序存在的一些隐患。其它工具今后有用到的话再做分享,你们感兴趣的话可以自行去研究学习。

Valgrind交叉编译

1、下载valgrind源码包:

wget http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

2、修改valgrind里的configure文件:

把armv7*)改成armv7*|arm)。

windbg 内核调试_linux 内核调试_高桥浩和linux内核精髓精通linux内核必会的75个绝

3、生成Makefile

./configure --host=arm-linux-gnueabihf CC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc CXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++ --prefix=$PWD/tmp

高桥浩和linux内核精髓精通linux内核必会的75个绝_linux 内核调试_windbg 内核调试

这个命令其实很长,但并不难,只是加了几个配置参数。这种配置参数怎样看?

我们可以输入./configure--help命令来查看支持的配置:

高桥浩和linux内核精髓精通linux内核必会的75个绝_linux 内核调试_windbg 内核调试

下边我们依次来剖析里面那种很长的命令:

这时侯早已生成了Makefile文件:

高桥浩和linux内核精髓精通linux内核必会的75个绝_linux 内核调试_windbg 内核调试

编译、安装:

make
make install

安装完成后tmp文件夹下的内容为:

linux 内核调试_windbg 内核调试_高桥浩和linux内核精髓精通linux内核必会的75个绝

这时侯我们就可以把tmp整个文件夹拷到板子上使用了。tmp的大小为一百多兆linux 内核调试,注意查看板子储存空间够不够:

windbg 内核调试_linux 内核调试_高桥浩和linux内核精髓精通linux内核必会的75个绝

我们可以配置板子上的valgrind环境。倘若仅是临时使用,可以如此用:

tmp/bin/valgrind --tool=memcheck --leak-check=yes ./valgrind_test

其中,tmp文件夹与与valgrind_test在同一路径。这时侯可能会报如下错误:

“valgrind: failed to start tool ‘memcheck’ for platform ‘arm-linux’: No such file or directory”

这是由于valgrind须要依赖其动态库,而没有找到动态库。由于是临时测试,在valgrind_test路径输入如下命令进行设置:

export VALGRIND_LIB="tmp/lib/valgrind"

这只是在当前开发板终端生效,上次重新步入开发板终端须要重新设置。

参考资料

1、#quick-start.prepare

2、

3、

4、

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 仿真 应用 泄漏 源码 调试
最后更新:2023年5月14日

Linux系统网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux系统网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Windows和linux服务器的区别,你知道几个? gdb调试运行中的Python进程步骤 修改ssh默认端口号的方法及注意事项!服务器 企业应用程序的未来提供动力?——Linux服务器 Coredump:程序异常原因解析 Linux和Windows操作系统在服务器中的优势有哪些 设置开机自启动的方法和操作环境 Linux内核版本查看命令大全命令排查方法 Linux中可以使用xxd命令来查看二进制文件的内容和结构 mysql默认密码策略无法修改简单的密码必须要做 Linux开机自启动的常用方法来设置Linux系统启动命令 VisualStudio调试器的转储文件是怎样的?| 串口驱动框架分析之u-boot串口接收缓冲中的示例 常用命令/文件处理、基础功能介绍 不同操作系统发行的软件包可否混用? Linux系统如何添加开机启动自动启动的方式有很多种 ftp命令是标准的文件传输协议的用户接口,ftp Ubuntu16.04下完美切换Python版本(亲测) apt命令需要获得root,一般格式为sudoapt-getxxx! linux必装软件 Python、R、Jupyter等在内超过1500个数据科学包及其依赖项
什么是发行版(distro)的英文原文是什么?如何删除不要的应用软件?Linux安装源程序包CentOS上离线搭建SVN服务器的操作字符设备架构的大概原理、常用的数据结构和函数安装系统设计不合理,十招不需要顺序执行!5个最稳定的Linux发行版,你值得拥有!Linux内核体系体系结构简析图(上报)|维护者名单linux增加/根目录的磁盘空间(基于LVM)问题引出makemenuconfig和makeconfig内核的配置方式linux sdio wifi 驱动 STM3232ff1010概览为例对标准库开发进行LinuxCrontab日志的几种方式查看日志管理工具的作用构建定制化的Linux-3.5内核构建步骤及使用方法!单片机开发转入嵌入式开发的工程师是怎么做的MySQL数据库如何在Linux系统上面进行自动备份创建备份目录Linux内核裁剪——无模块支持(title-引导条)如何通过rar官方源码包正确安装unrar包编译安装解压命令2023年第一个符合OpenGLES3.1标准的GPU驱动程序(IPO)管理用户(user)的工具或命令;Linux基础知识:一个文件复制到当前文件夹如果系统没有自动检测到你的打印机,这篇文章教你
(Linux基础知识)Linux常用的压缩与解压缩命令 论文全文、论文答辩PPT、源代码PPT讲稿源代码设计 嵌入式Linux基础教程(第2版)-高级驱动教程 Linux内核的时间概念与时间管理、内存管理的区别 AmericanMegatrendsU盘启动相对轻松易行,只需下载Megatrends Linux系统中如何设置环境变量?- 从零开始学习Linux的入门指南-零基础学Linux Docker在服务器中搭建Docker环境的常用方式及解决办法 Linu下如何升级当前sudo版本至sudo-1.8.31 Linux中如何关闭中断?-外设百科 从硬盘安装Linux操作系统方法,关键要学会两点! 一线工程师亲笔手把手教你做Linux内核分析与应用 两台Linux系统之间要想传输文件可以采用的方式 在Linux系统上删除一个用户的家目录选项使用 Linux系统进程标识符的方法有多种格式命令 Linux内核的内存子系统映射的漏洞及解决办法 windows本地IP安全策略设置一些危险端口的阻止! 参考win10ubuntu双系统安装10和ubuntu启动的区别 如何根据硬件信息来解决问题?——Linux中的常用工具 在阿里云上安装桌面环境,轻松享受高效办公!
标签聚合
目录 linux服务器 命令 软件 文件目录 linux系统 文件 操作 内核 应用
书籍
课程
技术群
技术干货大合集↓
  • 2023年11月 / 86篇
  • 2023年10月 / 94篇
  • 2023年9月 / 90篇
  • 2023年8月 / 92篇
  • 2023年7月 / 96篇
  • 2023年6月 / 91篇
  • 2023年5月 / 93篇
  • 2023年4月 / 91篇
  • 2023年3月 / 69篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源 | Linux系统

COPYRIGHT © 2024 LinuxZone.net ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang