2013-11-19 1 views
12

Я проверяю мою в Valgrind-анкету я не могу понять, почему он выдает ошибку на непризнанном инструкции в этом здесь:Valgrind unrecognizes memcmp обучения в Raspberry Pi

unsigned char *temp=SearchStartPtr; 
unsigned char *NrStartPos=NULL; 
unsigned char *Param=(unsigned char*)ParamName; //this is originally *char with "PAR#" inside 

if(0==memcmp(temp,Param,4)) 
     { 
     NrStartPos=temp; 
     break; 
     }  

Valgrind бросает это и выходит из моего приложения.

disInstr(arm): unhandled instruction: 0xF1010200 
cond=15(0xF) 27:20=16(0x10) 4:4=0 3:0=0(0x0) 
==7679== valgrind: Unrecognised instruction at address 0x4843588. 
==7679== at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so) 
Your program just tried to execute an instruction that Valgrind 
==7679== did not recognise. There are two possible reasons for this. 
==7679== 1. Your program has a bug and erroneously jumped to a non-code 
==7679== location. If you are running Memcheck and you just saw a 
==7679== warning about a bad jump, it's probably your program's fault. 
==7679== 2. The instruction is legitimate but Valgrind doesn't handle it, 
==7679== i.e. it's Valgrind's fault. If you think this is the case or 
==7679== you are not sure, please let us know and we'll try to fix it. 
==7679== Either way, Valgrind will now raise a SIGILL signal which will 
==7679== probably kill your program. 
==7679== 
==7679== Process terminating with default action of signal 4 (SIGILL) 
==7679== Illegal opcode at address 0x4843588 
==7679== at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so) 

Обычно код работает нормально (однако я не знаю, есть ли у него какие-либо утечки памяти).

Я точно знаю, что проблема - инструкция memcmp, но я не понимаю, что не так.

Ранее в коде у меня есть другая инструкция, которая делала то же самое, но я мог бы просто прокомментировать его прочь перед проверкой:

memcmp(ReadPtr,ToWritePtr,sizeof(struct termios) 
+1

Если вы прочтете сообщение более внимательно, он скажет, что обнаружил незаконную инструкцию (например, инструкцию по сборке). 'memcmp' - это функция, а не инструкция. Кроме того, Valgrind утверждает, что эта незаконная инструкция была найдена в '/ usr/lib/arm-linux-gnueabihf/libcofi_rpi.so', вряд ли файл, который вы создали, я бы рискнул. –

ответ

15

Казалось бы, что это known issue с Valgrind на Pi.

Для подведения итогов версии memcmp в Raspbian используется инструкция по сборке, которую текущий Valgrind просто не может обработать. К сожалению, эта специальная инструкция, по-видимому, будет очень трудной для поддержки Valgrind, так что вряд ли это произойдет - bug был поднят в трекер Valgrind, но был закрыт как WONTFIX.

О единственном способе, с которым я могу работать, это заменить вашу собственную версию memcmp и надеяться, что она не скомпилируется, чтобы включить проблематичную инструкцию.

+1

отличный ответ.как возможное исправление этой проблемы, попробуйте использовать strcmp [если вы посмотрите на след valgrind под сообщением об ошибке, похоже, что это нормально с заменой strcmp] – amdixon

+0

Функции в/usr/lib/arm-linux-gnueabihf/libcofi_rpi. поэтому кодируется в сборке, маловероятно, что версия C будет скомпилирована с инструкцией сборки SETEND, поэтому можно, вероятно, создать версию C и использовать LD_PRELOAD для переопределения проблемного memcmp – nos

+12

И все в порядке, это проще, чем это. /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so сам предварительно загружен. Так что просто отредактируйте /etc/ld.so.preload на малине и закомментируйте строку, которая должна дать вам memcmp от glibc вместо – nos

3

У меня такая же проблема с вами.

Я проверяю репозиторий arm-mem и, кажется, его заменяют memcmp в libc. Итак, мое решение для использования valgrind - удалить arm-mem временно, затем использовать исходную реализацию в libc.

Попробуйте это:

$ sudo mv /usr/lib/arm-linux-gnueabihf/libarmmem.so /usr/lib/arm-linux-gnueabihf/libarmmem.so.orig 
$ sudo ln -s /lib/arm-linux-gnueabihf/libc.so.6 /usr/lib/arm-linux-gnueabihf/libarmmem.so 
$ sudo ldconfig 

Теперь попробуйте заново запустить Valgrind ...

Позже, переместите его назад:

$ sudo rm /usr/lib/arm-linux-gnueabihf/libarmmem.so 
$ sudo mv /usr/lib/arm-linux-gnueabihf/libarmmem.so.orig /usr/lib/arm-linux-gnueabihf/libarmmem.so 
$ sudo ldconfig 
0

Вам нужно пропатчить libarmmem.so работать только в режиме little-endian. Чтобы построить ответ @ nigelharper, Valgrind не поддерживает операцию в обратном endian, и поэтому ловушки в команде SETEND. Тем не менее, memcmp() может быть реализован без SETEND, как это сделано здесь: https://github.com/rsaxvc/arm-mem/commit/b836e465c2fd0bb006b428abce99e31607072834

@ user167752 также правильно, что отключение libarmmem также будет работать, но это изменится из всех libarmmem, а не только memcmp()