В чем разница между valgrind и обычным c ++ run - PullRequest
1 голос
/ 17 августа 2011

Я пытаюсь определить ошибку в моем коде , где я получаю сег.ошибка при попытке присвоить значение указателю из вектора (лучше описать в ссылке).Когда я запускаю код с использованием valgrind, я не получаю seg.fault.

Что Valgrind делает по-другому.Я думаю, что мне нужно учитывать различия в управлении памятью между сеансом valgrind и обычным сеансом c ++, но я действительно не знаю

Ответы [ 4 ]

4 голосов
/ 17 августа 2011

С FAQ по Valgrind :

4.4.Моя программа нормально падает, но не под Valgrind, или наоборот.Что происходит?

Когда программа работает под Valgrind, ее среда немного отличается от того, когда она запускается изначально.Например, структура памяти отличается, и способ, которым запланированы потоки, отличается.

В большинстве случаев это не имеет никакого значения, но может, особенно если ваша программа содержит ошибки.Например, если ваша программа дает сбой из-за того, что она ошибочно обращается к памяти, которая не имеет адреса, возможно, что эта память не будет недоступна при запуске под Valgrind.Кроме того, если ваша программа использует гонки данных, они могут не проявляться в Valgrind.

Вы ничего не можете сделать, чтобы изменить это, просто характер работы Valgrind заключается в том, что он не может точно реплицировать нативныйсреда исполнения.В случае, если ваша программа вылетает из-за ошибки памяти при ее запуске, а не при работе под Valgrind, в большинстве случаев Memcheck должен идентифицировать неверную операцию памяти.

Таким образом, вы ничего не можете с этим поделать,На самом деле вам не нужно беспокоиться о том, что ваша программа не работает под Valgrind.Вы должны прочитать сообщения об ошибках и исправить их.Начните с Неверное чтение / Неверные ошибки записи .Они почти всегда указывают на ошибку в коде.В этом конкретном случае вы также можете запустить свой код в бесконечном цикле из простого bash-скрипта, пока он не выдаст сообщение об ошибке.Скорее всего, вы работаете с недопустимыми итераторами, и это Неопределенное поведение в C ++.

0 голосов
/ 17 августа 2011

Valgrind запускает вашу программу на виртуальном процессоре, то есть он выполняет каждую инструкцию по сборке в программном обеспечении (кроме вызовов ядра).Многопоточные программы сериализуются, то есть за один раз выполняется только один поток выполнения.

Если ваше приложение является многопоточным, когда оно выполняется в условиях гонки valgrind и отсутствие синхронизации может быть замаскированосериализацией потока, так что последствия таких ошибок не наблюдаются.

0 голосов
/ 17 августа 2011

Valgrind отслеживает использование памяти ваших программ. Вот как это говорит вам о утечках. Это означает, что он захватывает malloc и тому подобное и использует свой собственный, чтобы достичь этого. Это означает, что, вероятно, когда вы выполняете свой код нормально, вы читаете / записываете некоторые данные, которые вы освободили, случайно вызывая segfault, тогда как может случиться так, что valgrind хранит эту память, чтобы увидеть, действительно ли она потеряна и т. Д., Что означает (не) удачу память все еще в силе. Просто предположение.

0 голосов
/ 17 августа 2011

Возможно, проблема может зависеть от времени. Когда вы запускаете свой код с помощью valgrind, он работает немного медленнее, потому что valgrind собирает и диагностирует ваш код во время выполнения.

...