1

I tried to use valgrind in order to debug some memory corruption, but when I run the program to debug using valgrind it ends reporting Illegal instruction.

So I tried with this very simple code :

#include <iostream>
int main()
{
    std::cout << "Hello" << std::endl;
}

And when valgrind a.out fails :

==2677== Memcheck, a memory error detector
==2677== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==2677== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==2677== Command: ./a.out
==2677== 
disInstr(arm): unhandled instruction: 0xF1010200
                 cond=15(0xF) 27:20=16(0x10) 4:4=0 3:0=0(0x0)
==2677== valgrind: Unrecognised instruction at address 0x4843588.
==2677==    at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so)
==2677== Your program just tried to execute an instruction that Valgrind
==2677== did not recognise.  There are two possible reasons for this.
==2677== 1. Your program has a bug and erroneously jumped to a non-code
==2677==    location.  If you are running Memcheck and you just saw a
==2677==    warning about a bad jump, it's probably your program's fault.
==2677== 2. The instruction is legitimate but Valgrind doesn't handle it,
==2677==    i.e. it's Valgrind's fault.  If you think this is the case or
==2677==    you are not sure, please let us know and we'll try to fix it.
==2677== Either way, Valgrind will now raise a SIGILL signal which will
==2677== probably kill your program.
==2677== 
==2677== Process terminating with default action of signal 4 (SIGILL)
==2677==  Illegal opcode at address 0x4843588
==2677==    at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so)
Hello==2677== 
==2677== HEAP SUMMARY:
==2677==     in use at exit: 0 bytes in 0 blocks
==2677==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==2677== 
==2677== All heap blocks were freed -- no leaks are possible
==2677== 
==2677== For counts of detected and suppressed errors, rerun with: -v
==2677== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 19 from 6)
Illegal instruction

Is there a way to use valgrind on raspberry pi ?

mpromonet
  • 1,124
  • 18
  • 37

2 Answers2

1

There is a valgrind bug Bug 322935 - disInstr(arm): unhandled instruction: 0xF1010200, valgrind: Unrecognised instruction on Raspbian explains that std::cout << std::endl raise a SIGILL.

As the status is RESOLVED WONTFIX, I guess either I replace std::end with '\n' or I search an other way to debug.

mpromonet
  • 1,124
  • 18
  • 37
  • I'm sure I've hit this before. Now here's an odd angle: On raspbian using \n instead works, on pidora (same valgrind version, "-3.7.0 and LibVEX"), I get the exact same error either way ("LibVEX called failure_exit()...report_and_quit (m_libcassert.c:235)") -- prefaced by "valgrind: the 'impossible' happened"... – goldilocks Mar 29 '15 at 09:57
0

I've been able to work around this problem by making sure the system can't find the particular library that contains the non-standard ARM instructions.

On Raspberry Pi 2:
sudo mv /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so_OLD

On Raspberry Pi 3:
sudo mv /usr/lib/arm-linux-gnueabihf/libarmmem.so /usr/lib/arm-linux-gnueabihf/libarmmem.so_OLD

This may produce some error messages regarding the missing libraries, but they do not seem to affect the proper functioning of Valgrind.

ishmael
  • 101
  • 1