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
2525 0
|
Linux C语言
Linux These critical programs are missing or too old: compiler
Linux These critical programs are missing or too old: compiler
1944 0
Linux These critical programs are missing or too old: compiler
|
5天前
|
芯片
ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记
ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记
101 0
|
NoSQL 前端开发 rax
Dev 日志 | 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查
本文记录了 Segmentation fault (core dumped) 和 internal compiler error: Illegal instruction 两个错误信息的 Debug 过程
2494 0
|
8月前
|
Windows
你需要了解的JIT Debugging
你需要了解的JIT Debugging
|
iOS开发 MacOS
Qt 报错:Undefined symbols for architecture arm64
MacBook Pro Apple M1 使用 Qt 6.4.1 的时候碰到的报错,做了不同的尝试,最后解决了这个报错。
551 0
MAC编译:fatal error: ‘endian.h‘ file not found
MAC编译:fatal error: ‘endian.h‘ file not found
109 0
MAC编译出错:Undefined symbols for architecture x86_64: “_CFRelease“, referenced from:
MAC编译出错:Undefined symbols for architecture x86_64: “_CFRelease“, referenced from:
164 0
MAC编译OpenJDK8:clang: error: unknown argument: ‘-fpch-deps‘
MAC编译OpenJDK8:clang: error: unknown argument: ‘-fpch-deps‘
60 0
编译x264出现错误:No working C compiler found.
编译x264出现错误:No working C compiler found.
267 0