Valgrind 报错 disInstr(arm): unhandled instruction: 0xEC510F1E

简介: Valgrind 报错 disInstr(arm): unhandled instruction: 0xEC510F1E

问题背景

arm平台下使用交叉编译后的Valgrind 监测自己的进程发现依赖libcrypto的进程会报错。

大致如下

==20393== Memcheck, a memory error detector
==20393== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==20393== Using Valgrind-3.20.0 and LibVEX; rerun with -h for copyright info
==20393== Command: ./my_process
==20393== 
==20393== 
disInstr(arm): unhandled instruction: 0xEC510F1E
                 cond=14(0xE) 27:20=197(0xC5) 4:4=1 3:0=14(0xE)
==20393== valgrind: Unrecognised instruction at address 0x4d32848.
==20393==    at 0x4D32848: ??? (in /usr/lib/libcrypto.so.1.0.2)
==20393== Your program just tried to execute an instruction that Valgrind
==20393== did not recognise.  There are two possible reasons for this.
==20393== 1. Your program has a bug and erroneously jumped to a non-code
==20393==    location.  If you are running Memcheck and you just saw a
==20393==    warning about a bad jump, it's probably your program's fault.
==20393== 2. The instruction is legitimate but Valgrind doesn't handle it,
==20393==    i.e. it's Valgrind's fault.  If you think this is the case or
==20393==    you are not sure, please let us know and we'll try to fix it.
==20393== Either way, Valgrind will now raise a SIGILL signal which will
==20393== probably kill your program.

具体原因

在处理ARM平台上与Valgrind相关的问题时,特别是在交叉编译后遇到libcrypto库中无法识别的指令问题时,有几个因素和潜在解决方案需要考虑:

  1. 针对ARM的配置调整: 在为ARM交叉编译Valgrind时,可能需要进行特定的配置更改。例如,修改配置文件以正确地针对ARM架构是至关重要的。一个建议的命令用于这种调整是 sed -i -e "s#armv7#arm#g" configure【16†source】。
  2. 交叉编译环境: 确保交叉编译环境正确设置是至关重要的。这包括使用针对目标ARM平台的正确交叉编译器和设置。例如,如果您使用Fedora VM为ARM Cortex M4 CPU交叉编译,请确保编译环境(如QT IDE)正确配置为ARM平台【17†source】。
  3. Valgrind的中间语言(VEX): Valgrind使用一种中间语言(VEX)来模拟您的程序并检查内存违规。这种语言捕获了来自各种汇编器(如i386、amd64和ARM)的指令。然而,它有时可能会漏掉某些特殊指令,这可能与您在libcrypto库中遇到的问题有关【18†source】。
  4. Valgrind与ARM的兼容性: Valgrind旨在与多个平台(包括ARM)一起工作,但由于该工具的低级性质,与每个平台的兼容性维护是具有挑战性的。在所有平台上可能并不完全支持某些功能,这可能导致无法识别指令的问题【19†source】【20†source】。

总之,解决问题可能需要:

  • 调整配置,以针对ARM架构。
  • 确保交叉编译环境正确设置。
  • 了解Valgrind中间语言的局限性及其与ARM的兼容性。

如果这些步骤无法解决问题,则可能需要进一步调查Valgrind无法识别的特定指令或库函数。咨询Valgrind的文档或社区论坛,以获得更具体的关于ARM平台和libcrypto库的建议,也可能会有帮助。

背后原理

在处理Valgrind在ARM平台上无法处理特定指令的问题时,特别是指令 0xEC510F1E,我找到了一些相关信息。这个问题在KDE Bugtracking System上有报告,描述了与你遇到的问题相似的情况。

报告中提到的问题是Valgrind在处理位于 libcrypto.so.1.0.0 库中的 _armv7_tick 函数时,无法识别指令 0xEC510F1E。这条指令是 mrrc p15, #1, r0, r1, c14,用于读取CP15 CNTVCT寄存器(虚拟计时器)。这个指令的二进制表示如下所示:

cond  const   Rt2  Rt   copr opc1 CRm
1110 11000101 0001 0000 1111 0001 1110

这段代码一直可以重现此问题【32†source】。

这个问题表明Valgrind可能不支持某些专用的ARM指令,特别是那些与硬件计时器操作相关的指令。这可能导致Valgrind在尝试运行使用这些指令的代码时崩溃或表现出异常行为。解决此类问题可能需要更新Valgrind的版本,或者修改相关代码以避免使用Valgrind无法识别的指令。也可以考虑向Valgrind的开发团队报告此问题,以便在未来的版本中得到修复。

Valgrind无法识别读取CP15 CNTVCT寄存器(虚拟计时器)的原因可能与它如何模拟ARM处理器上的代码执行有关。Valgrind使用一个中间语言(VEX)来模拟程序的执行,这样它就能检测内存违规和其他错误。这种模拟过程需要Valgrind理解和翻译处理器的每一条指令。

然而,由于Valgrind是在高级别上模拟处理器指令,它可能不完全支持所有特定于处理器的指令,尤其是那些与硬件特性紧密相关的指令。在ARM处理器上,一些特殊的硬件操作指令(如读取硬件计时器寄存器)可能不在Valgrind的模拟范围内。

此外,Valgrind的开发和维护工作是一个持续的过程,新的处理器特性和指令集可能会在Valgrind支持它们之前出现。因此,当出现新的或不常用的处理器指令时,Valgrind可能无法正确识别并模拟这些指令,导致它无法处理涉及这些指令的代码。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

目录
相关文章
|
iOS开发
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
3261 0
|
6月前
|
开发工具 iOS开发 Perl
mac电脑升级到10.15.7含有支付宝SDK的组件更新报错:AlipaySDK.framework/AlipaySDK for architecture arm64
mac电脑升级到10.15.7含有支付宝SDK的组件更新报错:AlipaySDK.framework/AlipaySDK for architecture arm64
86 0
|
6月前
【ARM】rk3399挂载nfs报错
【ARM】rk3399挂载nfs报错
|
iOS开发 MacOS
Qt 报错:Undefined symbols for architecture arm64
MacBook Pro Apple M1 使用 Qt 6.4.1 的时候碰到的报错,做了不同的尝试,最后解决了这个报错。
690 0
|
Android开发
【错误记录】NDK 动态库报错 ( dlopen failed: file offset for the library /lib/arm64/libwebp.so“ >= file size:0)
【错误记录】NDK 动态库报错 ( dlopen failed: file offset for the library /lib/arm64/libwebp.so“ >= file size:0)
458 0
【错误记录】NDK 动态库报错 ( dlopen failed: file offset for the library /lib/arm64/libwebp.so“ >= file size:0)
|
开发工具 Android开发 C++
【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
543 0
|
iOS开发
Xcode8报错:**Framework not found IOSurface for architecture arm64** 或者 **Framework not found FilePr...
Xcode8 编译报错: Framework not found IOSurface for architecture arm64 或者Framework not found FileProvider for architecture x86_64/arm64. 原因 IOSurface.framework和 FileProvider.framework是 iOS11 新增加的库,但 Xcode8下没有这个库。
1586 0
|
1月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
1月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
46 0
|
1月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。