2012-07-03 2 views
20

Я следовал за this approach, чтобы запустить Valgrind в приложении iOS. К сожалению, предупреждения, относящиеся к SDK iOS, практически не позволяют найти какие-либо предупреждения, связанные с моим приложением. Есть ли список запретов iOS для Valgrind, поэтому мне не нужно их самостоятельно создавать?Подавлять предупреждения Valgrind от iOS SDK

+1

+1, Узнал что-то новое сегодня – doNotCheckMyBlog

+0

Любые предупреждения, особенно в main.m, которые вы хотели бы подавить? – CodaFi

+0

@CodaFi Я получаю целую кучу «Условный прыжок или движение зависит от неинициализированной ценности», что, если я не ошибаюсь, все, похоже, происходят из SDK. См. Http://pastebin.com/fVHnhNh6 для экстракт. – marcog

ответ

3

Похоже, что вы, вероятно, можете изменить код, который находится в вашем main(), чтобы он передал правильные параметры Valgrind. (Обратите внимание, что это предполагает, что вы используете memcheck, который является параметром по умолчанию, а также то, что вы, кажется, используете из вашего pastebin).

Ожидается, что Valgrind/Memcheck сообщит об ошибках в библиотеках, которые у вас уже есть, включая SDK Obj-C/iOS. Для подавления MemCheck из сообщений об ошибках, используйте:

Это создает подавления автоматически: --gen-suppressions=yes


Вы также могу/может хотеть пойти немного больше глубины и настроить то, что вы не хотите см:

Добавить файл подавления следует рассматривать: --suppressions=/path/to/file.supp.

подавление типа (второй) линии Shou LD имеют вид:

Memcheck:suppression_type

MemCheck типов подавления заключаются в следующем:

Value1, Value2, Value4, Value8, Value16, а это означает ошибку неинициализированные-значение при использовании значения 1, 2, 4, 8 или 16 байт.

Cond (or its old name, Value0), что означает использование неинициализированного кода состояния процессора.

Addr1, Addr2, Addr4, Addr8, Addr16, что означает недопустимый адрес при доступе к памяти 1, 2, 4, 8 или 16 байт соответственно.

Jump, что означает переход к непредсказуемой ошибке местоположения.

Param, что означает неправильную ошибку параметра системного вызова.

Free, что означает недопустимый или несоответствующий свободный.

Overlap, что означает перекрытие src/dst в memcpy или аналогичную функцию.

Leak, что означает утечку памяти.

Также уточните suppressing errors in the Valgrind docs для получения дополнительной информации. Обратите внимание, что вам разрешено иметь несколько файлов подавления, поэтому я просто напишу их, чтобы их можно было удалить позже.


Однако, вы можете захотеть взглянуть на почему эти ошибки появляются. Похоже, что многие из них - это SDK, для которого вы можете игнорировать - но, возможно, после включения истоков трека (что вы сделали) и проверки вашего собственного кода на всякий случай.

Ошибки неинициализированного значения - это то, где вас предупреждают о неинициализированных значениях (duh). Однако это происходит только тогда, когда у вас есть неинициализированное значение, которое будет иметь значение, поскольку существуют другие виды использования неинициализированных значений.

Обычно они могут распространяться до тех пор, пока вы не будете использовать их там, где вы «не должны». Он сообщает эти значения, тогда, когда вы на самом деле пытаетесь их использовать.

Вы уже знаете, что вы можете включить --track-origins=<yes|no> (по умолчанию нет), чтобы узнать, откуда они, и похоже, что они из SDK. Для тех, кто не знает, --track-origins действительно очень полезен, потому что когда он выключен, вы только знаете, что неинициализированное значение используется «опасным» способом, но вы не знаете, откуда взялось неинициализированное значение.

Помните, что Memcheck отклонит установку этого параметра, если используется --undef-value-errors=no.