Конкретные советы / инструменты для отладки для отслеживания повреждения памяти?

#c #debugging #memory

#c #отладка #память

Вопрос:

Я пишу простой видеокодер, который сжимает видео YUV420p. Я заметил, что результирующий файл всегда выглядит немного иначе, когда я восстанавливаю его из того же входного файла с теми же настройками сжатия. Никаких больших изменений, обычно всего несколько битов страдают от эффекта «переворота битов космического луча».

Ни в коем случае в моей программе я не использую рандомизированные значения, поэтому результирующий вывод всегда должен быть одинаковым. Я подозреваю, что моя программа выполняет чтение / запись за пределами выделенной памяти, что объясняет случайность данных.

Помимо обычных методов отладки, существуют ли специальные инструменты / хитрости, которые помогут мне обнаружить причину этих махинаций?

Комментарии:

1. а) используйте идиоматический C (без указателей или new ), б) запустите программу через отладчик памяти, такой как valgrind .

2. Размещайте исходные значения в начале и конце ваших буферов. Проверьте их, когда закончите.

3. IBM по-прежнему выпускает Purify? Это был потрясающий инструмент, когда я в последний раз занимался C .

Ответ №1:

Если в ОС Windows, вы можете попробовать AppVerifier

Комментарии:

1. Я поддержу это — средство проверки одного приложения в прошлом довольно хорошо помогало нам отслеживать повреждение памяти.

Ответ №2:

  • используйте варианты отладки ваших контейнеров
  • используйте интерфейсы ваших контейнеров, а не необработанную память
  • MallocDebug
  • MallocLogging
  • valgrind
  • MallocScribble
  • в некоторых случаях вы можете выполнить операцию дважды с тем, что вы должны ожидать, чтобы результаты были одинаковыми — проверьте совпадение результатов (обратите внимание, что вы не должны сравнивать память напрямую, но использовать интерфейсы).
  • если вы достаточно хорошо знаете используемые алгоритмы, вы могли бы предоставить входные данные, которые вы можете проанализировать на выходе на наличие ошибок (например, «если входные данные представляют собой черную рамку, выходные данные также должны быть черной рамкой»).

не уверен, на какой платформе вы разрабатываете. упомянутые инструменты предназначены для ‘nixes и OS X (также ‘nix, но …)

Ответ №3:

Вы можете создать одну выходную запись, а затем создать другую. И в процессе сжатия каждого выходного бита первого вы можете сравнить с тем же битом второго. Я не знаю компрессор. Но если у вас есть несколько этапов сжатия, вы можете сделать несколько записей разных этапов для первой результирующей записи. При сжатии второй результирующей записи вам необходимо сравнивать биты на каждом этапе с битами соответствующих записей первого вывода. В результате вы можете найти определенное место, которое повреждает биты.