2013-07-04 1 views
1

У меня есть C++ исполняемый, когда я запустить этот бинарный файл с помощью следующей командыC++ двоичная отлично выполняет во время работы с Valgrind, но сбиваться при запуске только в этом бинарного

valgrind -v --leak-check=full --show-reachable=yes --track-origins=yes mybinary -mode init > 5.log 2>&1 

он вышел с 0, и все выходные созданных файлов.

Но когда я запускаю этот двоичный файл как

mybinary -mode init > 5.log 2>&1 

это ядро ​​захоронения во многих местах (один после другого места).

Почему изменение beahavior меняется, когда я бежал с valgrind? Вставляет ли valgrind какие-либо внутренние переменные среды?

+1

Что говорит valgrind log? – billz

+3

С такой небольшой информацией мы можем догадываться. Моя, ваша программа демонстрирует неопределенное поведение и тот факт, что она работает, когда работает под «valgrind» - это просто случайность. – syam

+0

Демпинговые ядра во многих местах указывают на то, что он либо многопоточен, либо использует fork, что означает, что при запуске valgrind будет отличаться время (что также может синхронизировать вещи в некотором роде, так как я уверен, что у него есть блокировки, чтобы предотвратить привязку сам в узлы). Посмотрите на условия гонки и проанализируйте свои ядро-дампы, чтобы попытаться понять, куда они идут. –

ответ

1

В самом Valgrind руководстве says,

VALGRIND serialises исполнение так, что только один (ядро) поток выполняется в то время. [...] ваша программа увидит очень разное планирование при запуске на Valgrind, чем при нормальной работе. Это связано с тем, что Valgrind сериализует потоки, и потому что код работает намного медленнее, чем обычно.

Кроме того, вы используете инструмент Valgrind по умолчанию, memcheck. Вы можете попробовать использовать любой из инструментов, ориентированных на поток, таких как helgrind или DRD, чтобы получить что-то конкретное в проблемах параллелизма.