valgrind跨平台调试及其问题分析

news2024/12/24 9:02:32

背景

同事在项目中遇到了内存泄漏问题,长时间没有解决,领导临时让我支援一下。心想,应该不难,毕竟我之间做过valgrind的使用总结。并输出内存泄漏问题分析思路(案例篇)和快速定位内存泄漏的套路两篇文章,应该能够较快定位问题并解决。但经与同事交流过程中,发现并不是阻塞在valgrind的使用,而是如何将valgrind工具移植到目标平台上。于是问题就演变成如何将valgrind交叉编译并跨平台调试

原以为自己比较熟悉交叉编译,很快能解决。结果也花费了一天时间。主要是调试阶段遇到了较多问题。分析和解决的过程还是比较有意思的,希望本篇内容能够帮助到大家。

交叉编译

  1. 下载源码。通过以下链接进行下载。我选择的是最新版本3.22.0。
https://valgrind.org/downloads/

  1. 解压tar -xvf valgrind-3.22.0.tar.bz2
  2. source 交叉编译环境变量。source /opt/corbos-linux/2.30.0/environment-setup-cortexa53-crypto-poky-linux
  3. 生成编译Makefile。./configure --prefix=/update/yihua/ --host=aarch64-linux
  • 其中--prefix非常重要,该路径需要与目标宿主机保持一致,否则容易出现一些奇葩问题。因为编译过程中,很多环境变量是默认该路径。运行时,会优先从该路径查找。
  • --host表示目标平台的架构及操作系统。比如本示例的架构是aarch64,操作系统为linux。

小技巧:快速确认目标设备的架构和操作系统的方式

  1. 在目标设备上执行uname -a指令。
  2. 查看交叉编译工具链中库的文件头。

  1. 编译。make -j8,其中-j8是启动多线程,加快编译速度。
  2. 安装。make install

最终在/update/yihua目录下生成4个目录,分别为binincludeliblibexecshare

  • bin目录中主要是调试工具,包括我们需要使用的valgrind。仅需保留valgrind即可,其它删除。
  • include目录用于编译的头文件,在本示例中不需要,可以删除。
  • lib目录用于编译的头文件,在本例中不需要,可以删除。
  • libexec可以将其中的.js,.py,html等文件删除。
  • share目录为指导手册,在本示例中不需要,可以删除。
    最终内容如下:

调试

  1. binlibexec目录拷贝到目标宿主机的/update/yihua目录下。
  2. source 程序的环境变量,并调试。
root@hpe-linux:/update/yihua# chmod 777 /update/yihua/bin/valgrind
root@hpe-linux:/update/yihua# export LD_LIBRARY_PATH=/update/ucm/lib:$LD_LIBRARY_PATH
root@hpe-linux:/update/yihua# /update/yihua/bin/valgrind --tool=memcheck --leak-check=full /update/ucm/bin/otamaster -c /update/ucm/etc/otamasterConfig.json
valgrind: valgrind: failed to start tool 'memcheck' for platform 'arm64-linux': Permission denied
root@hpe-linux:/update/yihua#

问题一:权限不足

可知报了valgrind: failed to start tool 'memcheck' for platform 'arm64-linux': Permission denied错误。对于这种报错,我们可以通过strace 命令查看其加载路径。如下:

可知是执行/update/yihua/libexec/valgrind/memcheck-arm64-linux命令时出现了权限不足问题,因此我们可以通过chmod赋予可执行权限。

问题二:动态链接器丢失

现象如下:

root@hpe-linux:~# chmod 755 /update/yihua/libexec/valgrind/memcheck-arm64-linux
root@hpe-linux:~# /update/yihua/bin/valgrind --tool=memcheck --leak-check=full /update/ucm/bin/otamaster -c /update/ucm/etc/otamasterConfig.json
valgrind: m_ume.c: can't open interpreter

通过strace命令查看,可知,valgrind默认在/update/yihua/目录下,没有找到ld-linux-aarch64.so.1动态库。那么问题来了,是否可以将系统默认的/usr/lib/ld-linux-aarch64.so.1拷贝到相应目录呢?

答案是肯定不行的。会出现如下错误:

root@hpe-linux:/update/yihua# cp /lib/ld-linux-aarch64.so.1 .
root@hpe-linux:/update/yihua# /update/yihua/bin/valgrind --tool=memcheck --leak-check=full /update/ucm/bin/otamaster -c /update/ucm/etc/otamasterConfig.json
==606937== Memcheck, a memory error detector
==606937== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==606937== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==606937== Command: /update/ucm/bin/otamaster -c /update/ucm/etc/otamasterConfig.json
==606937==

valgrind:  Fatal error at startup: a function redirection
valgrind:  which is mandatory for this platform-tool combination
valgrind:  cannot be set up.  Details of the redirection are:
valgrind:
valgrind:  A must-be-redirected function
valgrind:  whose name matches the pattern:      strlen
valgrind:  in an object with soname matching:   ld-linux-aarch64.so.1
valgrind:  was not found whilst processing
valgrind:  symbols from the object with soname: ld-linux-aarch64.so.1
valgrind:
valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
valgrind:  package on this machine.  (2, longer term): ask the packagers
valgrind:  for your Linux distribution to please in future ship a non-
valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
valgrind:  that exports the above-named function using the standard
valgrind:  calling conventions for this platform.  The package you need
valgrind:  to install for fix (1) is called
valgrind:
valgrind:    On Debian, Ubuntu:                 libc6-dbg
valgrind:    On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo
valgrind:
valgrind:  Note that if you are debugging a 32 bit process on a
valgrind:  64 bit system, you will need a corresponding 32 bit debuginfo
valgrind:  package (e.g. libc6-dbg:i386).
valgrind:
valgrind:  Cannot continue -- exiting now.  Sorry.

通过strace分析如下:

出现该错误的原因是:valgrind依赖动态链接器ld-2.32.so中的调试信息定位内存的分配和释放,因此就依赖动态链接器是not striped的

宿主设备往往因为磁盘资源的限制,都会将文件进行strip,那么如何获取非strip文件呢?

  1. 确认系统的版本,进行交叉编译。当然这种方式最为麻烦,属于无奈之举。
  2. 在交叉编译工具链中查找因为我们知道链接生成可执行程序时,需要连接对应的动态库,确认符号的类型。那么在交叉编译工具链中肯定会有对应的动态库。搜索如下:

  1. 通过查找发现工具链中有3个ld-2.32.so。初步分析,可以知道分别是:
    1. /x86_64-pokysdk-linux/lib/ld-2.32.so,x86环境。
    2. /cortexa53-crypto-poky-linux/lib/.debug/ld-2.32.so,交叉编译环境且属于debug版本。
    3. ./cortexa53-crypto-poky-linux/lib/ld-2.32.so,交叉编译环境且经过strip。
  2. 尝试将debug版本拷贝到/update/yihua目录下,
root@hpe-linux:/update/yihua# ls -la
drwxr-xr-x    4 root     root         12288 Jan  1 06:50 .
drwxrwxrwx   15 root     root          4096 Jan  1 06:50 ..
drwxr-xr-x    2 root     root          4096 Jan  1 04:53 bin
-rw-r--r--    1 root     root        991400 Jan  1 06:36 ld-2.32.so
-rwxr-xr-x    1 root     root        149376 Jan  1 06:43 ld-linux-aarch64.so.1
drwxr-xr-x    3 root     root          4096 Jan  1 04:53 libexec
root@hpe-linux:/update/yihua#
  1. 执行/update/yihua/bin/valgrind --tool=memcheck --leak-check=full /update/ucm/bin/otamaster -c /update/ucm/etc/otamasterConfig.json。完结撒花~~~

接下来就可以进行分析了,这部分不是本篇内容,有兴趣可参考快速定位内存泄漏的套路。

总结

本文介绍valgrind跨平台的调试及应用过程,主要目的是想和大家分享遇到问题是的分析思路,如何一步步推荐,最终达到目的。再结合内存泄漏问题分析思路(案例篇)和快速定位内存泄漏的套路两篇文章,我相信内存泄漏,对于你而言,应该不再是令人头疼的问题了。

若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。
我的宗旨:
踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Github部分下载的方法

一、问题 在Github中,我需要下载部分文件,而github只有下载最原始文件夹和单独文件的功能。 比如我想下载头四个文件,难以操作。 二、方法 推荐使用谷歌浏览器,进入扩展程序界面: 在应用商店获取GitZip for github…

理解SQL中not in 与null值的真实含义

A not in B的原理是拿A表值与B表值做是否不等的比较, 也就是a ! b. 在sql中, null是缺失未知值而不是空值。 当你判断任意值a ! null时, 官方说, “You cannot use arithmetic comparison operators such as , <, or <> to test for NULL”, 任何与null值的对比都将返…

Java基础综合练习(飞机票,打印素数,验证码,复制数组,评委打分,数字加密,数字解密,抽奖,双色球)

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

菜鸟之MATLAB学习——QPSK OQPSK信号生成及频谱分析

本人MATLAB学习小白&#xff0c;仅做笔记记录和分享~~ % qpsk && oqpsk clc; close all;Ts1; fc10;N_sample16; N_sum100; dt1/fc/N_sample; t0:dt:N_sum*Ts-dt; Tdt*length(t);d1sign(randn(1,N_sum)); d2sign(randn(1,N_sum));gtones(1,fc*N_sample); …

反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

一、反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路一&#xff1a;翻转单链表指针方向 这里解释一下三个指针的作用&#xff1a; n1&#xff1…

【Linux驱动】设备树模型的LED驱动 | 查询方式的按键驱动

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f36e;设备树模型的LED驱动&#x1f369;设备树文件&#x1f369;驱动程序 &#x1…

抽象类和接口的区别(小白版)

抽象类和接口的区别&#xff1a; 抽象类&#xff08;Abstract Class&#xff09;&#xff1a; 抽象类是一种不能被实例化的类&#xff0c;它只能被用作其他类的父类&#xff08;基类&#xff09;。抽象类可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法&#xf…

【JAVA】实验二 类与对象

实验名称 实验二 类与对象 实验目的 1. 深刻理解类的封装与继承&#xff1b; 2. 熟练掌握类的定义、包与路径、对象的创建、方法的调用、类的继承、方法的重写、运行时多态、访问权限修饰符的使用等&#xff1b; 3. 熟练运用JDK提供的常用类及API。 实验内容&…

测试自动创建设备节点的功能

一. 简介 上一篇文章在 新设备驱动框架代码的基础上&#xff0c;添加了自动创建设备节点的代码。文章地址如下&#xff1a; 自动创建设备节点代码的实现-CSDN博客 本文对自动创建设备节点的功能进行测试。 二. 自动创建设备节点代码的测试 1. 编译驱动&#xff0c;并拷贝…

Python 数据库(一):使用 mysql-connector-python 操作 MySQL 数据库

大家好&#xff0c;我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时&#xff0c;mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能&#xff0c;使您能够执行各种数据库操作&#xff0c;如连接数据库、执行查询和插入数据等。在本文…

2024年美赛数学建模ABCDEF题思路选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

[笔记] GICv3/v4 ITS 与 LPI

0. 写在前面 由于移植一个 pcie 设备驱动时&#xff0c;需要处理该 pcie 设备的 msi 中断(message signaled interrup)。 在 ARM 中&#xff0c; ARM 建议 msi 中断实现方式为&#xff1a; pcie 设备往 cpu 的一段特殊内存&#xff08;寄存器&#xff09;写某一个值&#xff0…

浅谈开关量信号隔离器在钢铁厂除鳞系统的应用-安科瑞 蒋静

摘要&#xff1a;在钢铁生产线中&#xff0c;轧制是其中一项重要的加工工艺。通过轧制将金属坯料进行延展和定型&#xff0c;满足不同行业的使用要求。在轧制前需要进行除鳞&#xff0c;除鳞系统是通过高压水形成扇形水束&#xff0c;喷射到钢坯表面将氧化铁层剥离。高压水由高…

精益生产敏捷实践手册:软件行业的精益转型之路——张驰咨询

精益生产培训的内容相当广泛&#xff0c;涵盖创立精益的理念、工具、执行策略和管理方法。下面将详细介绍各种培训内容以及它们的作用&#xff1a; 理念建设 精益生产基本概念&#xff1a;什么是精益&#xff0c;它的历史和核心理念等。 组织变革管理&#xff1a;怎样在组织…

数据库攻防学习之Redis

Redis 0x01 redis学习 在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识&#xff0c;那么什么是redis&#xff1f;redis就是个数据库&#xff0c;常见端口为6379&#xff0c;常见漏洞为未授权访问。 0x02 环境搭建 这里可以自己搭建一个redis环境&#xf…

2024网络安全趋势—— “双刃剑”效应带来全新冲击和挑战

“生成式AI”正以前所未有的方式影响着人们的生活和工作方式。 在网络安全方面&#xff0c;这项技术也正深刻改变着对抗形态和攻防模式&#xff0c;其在打开人类认知世界新路径的同时&#xff0c;也成为黑客开展网络攻击的“利器”。随着生成式AI的深入发展&#xff0c;“双刃…

别划走!3分钟看懂 Git 底层工作原理

这是一篇能让你迅速了解 Git 工作原理的文章&#xff0c;实战案例解析&#xff0c;相信我&#xff0c;3 分钟&#xff0c;绝对能够有收获&#xff01; Git 目录结构 Git 的本质是一个文件系统&#xff08;很重要&#xff0c;记住这句话&#xff0c;理解这句话&#xff09;&am…

oracle-undo

tips&#xff1a;串行化隔离级别&#xff1a;事务开始后&#xff0c;对一张表不会被别人影响&#xff0c;对于审计工作比较有用&#xff0c;避免了幻读。 undo表空间&#xff1a;自动生成段&#xff0c;自动生成区&#xff0c;自动维护的&#xff0c;不像一般的表空间&#xff…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性&#xff0c;来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…