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

背景

同事在项目中遇到了内存泄漏问题,长时间没有解决,领导临时让我支援一下。心想,应该不难,毕竟我之间做过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.mzph.cn/news/591880.shtml

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

相关文章

【C语言】Ubuntu 22上用GTK写GUI程序

一、GTK介绍 GTK (GIMP Toolkit) 是一个多平台的图形用户界面工具包。它最初是为图像处理程序 GIMP 开发的,后来演变成为许多操作系统上开发图形界面应用程序的通用库。GTK 是用C语言编写的,并且是自由和开源软件,遵循LGPL (GNU Lesser Gene…

三菱MR-JE伺服脉冲轴应用参数设置

三菱MR-JE伺服在脉冲轴控制上的应用,常用参数设置如下: 1、常用参数 未完...

Linux用shell脚本执行乘法口诀表的两种方式

#!/bin/bash # *********************************************************# # # # * Author : 藻头男 # # * QQ邮箱 : 2322944912qq.com # …

nginx 配置代理ip访问https的域名配置

前言 代理服务器是一种中间服务器,用于转发客户端请求到目标服务器。Nginx是一款高性能的Web服务器和反向代理服务器,可以用于配置代理IP访问HTTPS的域名。在本篇文章中,我们将介绍如何使用Nginx配置代理IP访问HTTPS域名,并提供相…

代码训练营Day.21 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 1. LeetCode链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 2. 题目描述 3. 解法 中序遍历,记录前一个指针,并记录前一个指针和当前指针的绝对差值。递归。 class Solution { public:Tre…

Javascript 循环结构while do while for实例讲解

Javascript 循环结构while do while for实例讲解 目录 Javascript 循环结构while do while for实例讲解 一、while语句 二、do…while语句 三、for循环 疑难解答 我们从上一节课知道,JavaScript循环结构总有3种: (1)while语…

ARM CCA机密计算硬件架构之内存管理

实施了TrustZone安全扩展的Arm A-profile处理器呈现两个物理地址空间(PAS): 非安全物理地址空间安全物理地址空间Realm管理扩展增加了两个PAS: Realm物理地址空间Root物理地址空间下图显示了这些物理地址空间以及如何在工作系统中实施这些空间: 正如表格所示,根状态能够访…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥,不会生成公钥,因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥,可以使用 openssl rsa 命令。 命令语法: ope…

Vue3全局属性app.config.globalProperties

文章目录 一、概念二、实践2.1、定义2.2、使用 三、最后 一、概念 一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。点击【前往】访问官网 二、实践 2.1、定义 在main.ts文件中设置app.config.globalPropertie import {createApp} from vue import ElementPl…

会声会影2023渲染闪退怎么办

​ 会声会影2023是一款功能强大,操作简单的视频剪辑软件。在使用会声会影剪辑视频后,我们要对视频进行渲染,有时会出现渲染到一半闪退,或是帧不可读的问题,那么遇到这些情况我们该怎么办呢?下面将为大家介绍…

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…

攻防世界easyphp解题

攻防世界easyphp解题 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die(&q…

PAT 乙级 1043 输出PATest

解题思路&#xff1a;对于c来说hash函数求出各个符号的数量&#xff0c;不为0时就输出即可&#xff0c;python利用字符串count函数就可以了。 c语言代码如下: #include<stdio.h> int output_c(char c,int *count) {if(*count!0){putchar(c);(*count)--;}return 1; } int…

Jenkins基础教程

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins1.4&#xff09;学习过程中的疑问 第二章、安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装…

面向对象(类和对象,对象内存图,成员变量和局部变量,封装,构造方法)

1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合简单理解&#xff1a;类就是对…

计算机网络(1)

计算机网络&#xff08;1&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;1&#xff09;因特网概念解读服务常见的服务 协议网络边缘特点强调 网络核心特点强调 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络…

Python模拟技巧实现自动抽屉登录和自动点赞

目录 一、引言 二、准备工作 三、自动抽屉登录 四、自动点赞 五、注意事项 六、案例分析 七、总结 一、引言 随着互联网的普及&#xff0c;人们越来越依赖于各种在线平台进行社交互动和信息获取。在这些平台上&#xff0c;用户需要登录才能享受各种服务&#xff0c;同时…

【DevOps】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境&#xff08;以php7.0为例 &#xff09;3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

Halcon底帽运算bottom_hat

Halcon底帽运算 底帽运算的原理是用原始的二值图像减去闭运算的图像。闭运算的目的是对某些局部区域进行“填补”&#xff0c;如填空洞、使分离的边缘相连接等。而底帽运算正是用来提取这些用于填补的区域的。图&#xff08;a&#xff09;为从二值图像中提取出的亮的区域&…

解决 Nginx 反向代理中的 DNS 解析问题:从挑战到突破20231228

引言 在使用 Nginx 作为反向代理服务器时&#xff0c;我们可能会遇到各种配置和网络问题。最近&#xff0c;我遇到了一个有趣的挑战&#xff1a;Nginx 在反向代理配置中无法解析特定的域名&#xff0c;导致 502 错误。这个问题的解决过程不仅揭示了 Nginx 的一个不太为人知的功…