rke*_*son 10 c++ valgrind raspberry-pi
我一直在试图调试分割故障最近使用我树莓派(B型)的valgrind,运行Debian GNU/Linux7.0(喘息).每次我在编译的C++程序上运行valgrind时,我都得到如下内容:
disInstr(arm): unhandled instruction: 0xF1010200
cond=15(0xF) 27:20=16(0x10) 4:4=0 3:0=0(0x0)
valgrind: Unrecognized instruction at address 0x4843638.
at 0x4843638: ??? (in /usr/lib/arm-linux-gnueabihf/libconfi_rpi.so)
Run Code Online (Sandbox Code Playgroud)
然后是正常的valgrind东西,导致SIGILL并终止我的程序.起初我假设我的程序中有一些内存泄漏导致它执行一条非指令内存作为指令,但后来我运行了以下hello world代码,得到了相同的结果.
#include <iostream>
using namespace std;
int main() {
cout<<"Hello World"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这可能不会有内存泄漏/段错误,为什么它会给我这个错误?我对valgrind很新,但我用最基本的方式运行它valgrind ./a.out.
从您的代码(一个简单的问候世界),它抱怨一个Unrecognized instruction at address 0x4843638.我的猜测是:
编辑:
http://valgrind.org/docs/manual/faq.html
3.3.我的程序死了,沿途打印这样的消息:
vex x86-> IR:未处理的指令字节:0x66 0xF 0x2E 0x5
一种可能是您的程序有错误并错误地跳转到非代码地址,在这种情况下您将获得SIGILL信号.Memcheck可能会在此之前发出警告,但如果跳转发生在可寻址内存中,则可能不会发出警告.
另一种可能性是Valgrind不处理该指令.如果您使用的是旧版Valgrind,则较新版本可能会处理该指令.但是,所有指令集都有一些模糊的,很少使用的指令.此外,在amd64上,冗余指令前缀的组合数量几乎无限,其中许多没有记录,但被CPU接受.因此Valgrind将不时有解码失败.如果发生这种情况,请提交错误报告.
编辑2:
从维基百科,Raspberry Pi CPU:
2.11.限制
在ARM上,ARM和Thumb模式都支持整个ARMv7-A指令集.ThumbEE和Jazelle不受支持.NEON,VFPv3和ARMv6媒体支持相当完整.
你的程序/库恰好有一些不支持的指令.
小智 5
在Raspberry Pi 3上安装Raspian的NOOBS,通过在终端窗口中执行以下操作来实现ayke的答案:
预加载的"libarmmem.so"包含"memcmp"函数中的"setend"指令,该指令导致未处理的指令错误.标准库(在未加载预加载的"libarmmem.so"库时使用)不包括"memcmp"中的"setend"指令.
| 归档时间: |
|
| 查看次数: |
4984 次 |
| 最近记录: |