首页 > 编程语言 >交叉编译valgrind在嵌入式设备上调试程序

交叉编译valgrind在嵌入式设备上调试程序

时间:2024-09-20 12:04:47浏览次数:8  
标签:gnu aarch64 3219788 valgrind 嵌入式 -- 调试程序 linux

valgrind是一个很好的内存检测工具,可以让程序员避免用“瞪眼法”去定位内存泄露问题。下面记录一下本人在arm64上使用valgrind的过程。

目录

1.下载最新版本的valgrind源码

https://sourceware.org/ftp/valgrind/

2.解压

tar -xjf valgrind-3.23.0.tar.bz2

3.编译

(1)valgrind早已经准备了不同平台的编译说明,进入目录找到对应平台的readme

README
README.aarch64
README.android
README.android_emulator
README_DEVELOPERS
README_DEVELOPERS_processes
README.freebsd
README.mips
README_MISSING_SYSCALL_OR_IOCTL
README_PACKAGERS
README.s390
README.solaris

(2)我所尝试的平台是aarch64的,参考README,为了方便把编译命令写入脚本

#$ vim build.sh
#!/bin/bash

export CC=aarch64-gnu-linux-gcc
export CXX=aarch64-gnu-linux-g++
export AR=aarch64-gnu-linux-ar
export RANLIB=aarch64-gnu-linux-ranlib
export STRIP=aarch64-gnu-linux-strip
export LD=aarch64-gnu-linux-ld
export NM=aarch64-gnu-linux-nm
export AS=aarch64-gnu-linux-as
export CFLAGS="--sysroot=/path/to/toolchain/sysroots/aarch64-gnu-linux -g"$CFLAGS
export CXXFLAGS="--sysroot=/path/to/toolchain/sysroots/aarch64-gnu-linux -g"$CXXFLAGS
export LDFLAGS="--sysroot=/path/to/toolchain/sysroots/aarch64-gnu-linux "$LDFLAGS

./autogen.sh
./configure --prefix=/tmp/ins --host=aarch64-gnu-linux \
              --enable-only64bit
make -j4
make -j4 install

在执行这个脚本之前肯定是需要切换到交叉编译环境的,不同的平台有不同的方法。

source env-setup-aarch64-gnu-linux

执行脚本:

chmod 777 build.sh
./build.sh

从脚本中可以看到,我加了很多东西,其中AR、RANLIB等,是编译其他工程时的参数,直接复制过来的,在这用不到。
CFLAGS里的--sysroot是必须写的,否则编译的时会找不到libc相关的头文件和库。

4.打包

在上一步中--prefix指定的是/tmp/ins,所以

cd /tmp/
tar -zcvf ins.tar.gz ins/ 

传到自己的开发板上

scp ins.tar.gz [email protected]:/tmp/

注意,最好把包解压到和prefix指定的相同的路径里。

4.运行

export VALGRIND_LIB=/tmp/ins/libexec/valgrind
/tmp/ins/bin/valgrind --tool=memcheck --leak-check=yes --log-file=valgrind_output.txt  ./mydemo  ${ARG1} "${ARG2}"

--leak-check表示用于检测内存泄露
--log-file是将结果输出到文件
mydemo是自己写得用例
${ARG1}、${ARG2}是mydemo的参数

5.报错及解决方法

1."valgrind: failed to start tool 'memcheck' for platform 'arm64-linux': No such file or directory"

解决方法:需要执行之前指定VALGRIND_LIB的路径,记住是libexec的路径:

export VALGRIND_LIB=/tmp/ins/libexec/valgrind

2.执行时被退出

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.

解决方法:

sudo apt-get install libc6-dbg

可惜,苦命的打工人在调试的时候,用的板子哪里有yum、apt-get、dplg那些东西?

还有人说自己编译glibc,不知道你成没成功,反正我用交叉编译glibc是没能成功。就算成功了,把libc库直接换到你的系统里,如果最后弄得ssh都用不了,哭都来不及。

更何况,我已经给mydemo编译的时候加了-g选项,还要我再安装libc6-dbg,你不觉的有些过分么?大不了我不看libc里的堆栈内容就行了,何必强人所难?

最终找到了解决方法:修改valgrind源码,把报错地方的VG_(exit)注释掉,重新编译valgrind,世界终于清净了。

 963       "%sCannot continue -- exiting now.  Sorry.\n", v);
 964       VG_(printf)("\n");
 965       //VG_(exit)(1);

神挡杀神,佛挡杀佛,如果还有别处报错也注释掉。

1914          VG_(printf)(
1915          "%sCannot continue -- exiting now.\n", v);
1916          VG_(printf)("\n");
1917          //VG_(exit)(1);

最后运行出来的结果是这样的,那些本来也不用去看的第三方库文件,显示"?"完全可以接受。

==3219788== 4,096 bytes in 2 blocks are possibly lost in loss record 12,024 of 12,306
==3219788==    at 0x74F66B8: malloc (vg_replace_malloc.c:446)
==3219788==    by 0x85A71AB: PL_ArenaAllocate (in /usr/lib/libplds4.so)
==3219788==    by 0x7AA0F43: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7AA1157: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7A5457F: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7A9AE27: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7A9AF93: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7A41D1F: ??? (in /usr/lib/libnss3.so)
==3219788==    by 0x7A42413: NSS_InitReadWrite (in /usr/lib/libnss3.so)
==3219788==    by 0x26C6E73: crypto::(anonymous namespace)::NSSInitSingleton::NSSInitSingleton() (in mydemo)
==3219788==    by 0x26C756B: crypto::EnsureNSSInit() (in mydemo)
==3219788==    by 0x25C5963: net::CertDatabase::GetInstance() (in mydemo)

标签:gnu,aarch64,3219788,valgrind,嵌入式,--,调试程序,linux
From: https://www.cnblogs.com/bugutian/p/18422214

相关文章

  • 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
    --痞子衡维护的NXP-MCUBootUtility工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍。这一次痞子衡为大家带来了全新重要版本v6.3.x,这次更新主要是想和大家特别聊聊ROM启动日志这个特性的支持。一、v6.0-v6.3更新记录--v5.......
  • 关于嵌入式硬件需要了解的基础知识
    成长路上不孤单......
  • 蓝桥杯嵌入式冲刺国奖-1、LED基础配置
     1、原理图在官方给的产品手册中,可以看到控制8个LED的引脚分别为PC8-PC15,,正常来说我们只需要修改引脚的高低电平即可控制灯的亮灭,但该原理图有一个PD2引脚,我们需要先拉高再拉低才可修改PC8-PC12的引脚。2、Cubemx基础配置首先选择芯片型号,我们用的板子是stm32g431rbt6,我......
  • 嵌入式基本知识梳理
    一、CPU的组成 CPU:中央处理器-----》soc(片上系统)(描述的是一种芯片,这个芯片具有运算程序的能力)、UART: UniversalAsynchronousReceiver/Transmitter,通用异步收发传输器)是一种广泛使用的串行通信协议,它允许设备通过两条线(TX和RX)进行全双工的异步通信。I2C:一种串行、半......
  • 嵌入式开发
    金葫芦STM32L431上手流程教材书名和开发板教材:《嵌入式技术基础与实践(第6版)》(王宜怀主编)开发板:AHL-STM32L431金葫芦STM32L431上手流程1、需要用到的软件和电子资源AHL-GEC-IDE(4.55)————>AHL-GEC-IDE(suda.edu.cn)AHL-MCU6-V2.0-20240118————>嵌入式书6版(suda.edu.cn)......
  • 嵌入式学习笔记
    #杂项#......
  • 嵌入式单片机程序运行机制,从helloworld说起
    1开篇学习任何一门编程语言,都会从helloworld开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的helloworld。然而,对于helloworld这个简单程序的内部运行机制,相信还有很多人都不是很清楚。helloworld这些信息是如何通显示器过显示的?cpu执行的代码和......
  • 计算机组成原理与嵌入式系统(1)计算机系统的基本结构组成与冯·诺依曼架构
    目录前言计算机系统的结构组成与工作原理基本构成与组成机器语言指令微程序硬连逻辑CISC与RISC思想课程研究目的计算机系统的工作原理——冯·诺依曼架构基于总线的冯·诺依曼架构模型机总线存储器子系统输入/输出子系统CPU子系统运算器控制器寄存器阵列缓......
  • 【嵌入式linux开发】旭日x3派部署自己训练的yolov5模型(安全帽识别、视频流推理、yolov
    旭日x3派部署自己训练的模型(安全帽识别、视频流推理、yolov5-6.2)windows,框架pytorch,python3.7效果模型训练模型转换1、pt模型文件转onnx2、检查onnx模型3、准备校准数据4、onnx转bin上板视频流推理1、图片推理2、视频流推理效果模型训练进官网可克隆yolov5......
  • 嵌入式开发必懂入门知识:认识嵌入式元件
    目录第一章嵌入式元件基础1.1电阻1.1.1电阻的基本概念与单位1.1.2电阻的种类及其在电路中的作用1.2电容1.2.1电容的基本原理与分类1.2.2电容在电路中的储能与滤波作用1.3电感1.3.1电感的基本概念与单位1.3.2电感在电路中的电磁感应作用第二章半导体元件......