от
Я работаю на многопоточные приложения на C , которая развращает кучи. Обычные инструменты для поиска этой коррупции представляется неприменимым. Старые билды (18 месяцев) исходного кода демонстрируют такое же поведение, как свежих релизов, так что это была вокруг в течение длительного времени и просто не заметил; с другой стороны, источник дельты не могут быть использованы, чтобы определить, когда ошибка была введена - там много изменений кода в репозитории. Запрашивать сбой behaviuor является создание пропускная способность этой системы - передача сокета данных, которые специально видоизмененные во внутреннее представление. У меня есть набор тестовых данных, которые будут периодически вызывать приложение в исключения (различные места, по разным причинам, в том числе кучи к alloc неудачу, таким образом: повреждение кучи). Поведение, кажется, относящиеся к мощности процессора и пропускной способности памяти; чем больше каждая машина имеет, тем легче его разбить. Отключение многопоточности Core или двухъядерный ядра снижает скорость (но не устранить) с коррупцией. Это говорит о проблеме времени. Теперь вот загвоздка: Когда он выполняется под легкий отладочной среде (скажем
Visual Studio 98 / AKA MSVC6
) повреждения кучи достаточно легко воспроизвести - десять или пятнадцать минут пройти, прежде чем что-то не чудовищно и исключения, как
alloc;
при работе в сложной отладки среды (рациональное очищает,
VS2008/MSVC9
или даже Microsoft средство проверки приложений) система становится памяти-скорость связаны и не катастрофа (оперативной памяти: процессор не поднимается выше
50%
, диск свет не включен, то программа будет, как быстро он может, потребляя коробка
1.3G
2Г ОЗУ). Итак, у меня есть выбор между тем, чтобы быть в состоянии воспроизвести проблему (но не определить причину) или idenify причина или проблема, я не могу воспроизвести. Моей нынешней лучшей догадки, где к следующему: Получим окно безумно грунты (чтобы заменить текущее окно Дэв: 2 ГБ оперативной памяти в
E6550 Core2 Duo
); это позволит репро аварии вызывает неправильное поведение при работе под мощную среду отладки; или Операторы переписать
new
и
delete
использовать
VirtualAlloc
и
VirtualProtect
в знак памяти только для чтения, как только с этим покончено. Работать под
MSVC6
и ОС ловить плохих парней, кто пишет на освобожденной памяти. Да, это знак отчаяния: кто, черт возьми, переписывает
new
и
delete
?! Я интересно, если это будет так медленно, как под очистить и соавт. И, нет: доставка с очистки инструментария встроенный не вариант. Коллега просто шел мимо и спросил: "переполнение стека? Теперь мы собираемся переполнения стека?!?" А теперь вопрос: как мне найти коррупционер кучи? Обновление: балансировка
new[]
и
delete[]
, похоже, долгий путь к решению проблемы. Вместо 15 минут, приложение теперь идет около двух часов до аварии. Еще не существует. Любые дальнейшие предложения? Кучи коррупция сохраняется. Обновление: релиз-сборку в Visual Studio 2008 С, кажется, значительно лучше; ток подозрение лежит на осуществление
STL
, который поставляется с
VS98
. Воспроизвести проблему.
Dr Watson
будет производить свалку, что может быть полезным в дальнейшем анализе. Я возьму на заметку, но я обеспокоен тем, что доктор Ватсон будет только подставляли постфактум, а не когда куча становится растоптала. Еще одну попытку может быть, используя
WinDebug
как инструмент отладки, который является достаточно мощным и в то же время и легкий. Есть то, что на данный момент, опять же: не сильно помогает пока что-то пойдет не так. Я хочу поймать вандала с поличным. Может быть, эти инструменты позволят вам, по крайней мере, чтобы сузить проблему для определенного компонента. Я не держу большие надежды, но отчаянные времена требуют... И вы уверены, что все компоненты проекта имеют правильные настройки среды выполнения библиотек (
C/C   tab
, генерация кода категории в vs 6.0 настройках проекта)? Нет, я не, и я потрачу пару часов завтра проходя через рабочую область (58 проектов) и проверять они все компиляция и связывание с соответствующими флагами. Обновление: это заняло 30 секунд. Выберите все проекты в диалоговом
Settings
, снимите, пока вы не найдете проект(ы), которые не имеют правильные настройки (они все были правильными настройками).

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

16 Ответы

0 голосов
от
Я работаю на многопоточные приложения на C , которая развращает кучи. Обычные инструменты для поиска этой коррупции представляется неприменимым. Старые билды (18 месяцев) исходного кода демонстрируют такое же поведение, как свежих релизов, так что это была вокруг в течение длительного времени и просто не заметил; с другой стороны, источник дельты не могут быть использованы, чтобы определить, когда ошибка была введена - там много изменений кода в репозитории. Запрашивать сбой behaviuor является создание пропускная способность этой системы - передача сокета данных, которые специально видоизмененные во внутреннее представление. У меня есть набор тестовых данных, которые будут периодически вызывать приложение в исключения (различные места, по разным причинам, в том числе кучи к alloc неудачу, таким образом: повреждение кучи). Поведение, кажется, относящиеся к мощности процессора и пропускной способности памяти; чем больше каждая машина имеет, тем легче его разбить. Отключение многопоточности Core или двухъядерный ядра снижает скорость (но не устранить) с коррупцией. Это говорит о проблеме времени. Теперь вот загвоздка: Когда он выполняется под легкий отладочной среде (скажем
Visual Studio 98 / AKA MSVC6
) повреждения кучи достаточно легко воспроизвести - десять или пятнадцать минут пройти, прежде чем что-то не чудовищно и исключения, как
alloc;
при работе в сложной отладки среды (рациональное очищает,
VS2008/MSVC9
или даже Microsoft средство проверки приложений) система становится памяти-скорость связаны и не катастрофа (оперативной памяти: процессор не поднимается выше
50%
, диск свет не включен, то программа будет, как быстро он может, потребляя коробка
1.3G
2Г ОЗУ). Итак, у меня есть выбор между тем, чтобы быть в состоянии воспроизвести проблему (но не определить причину) или idenify причина или проблема, я не могу воспроизвести. Моей нынешней лучшей догадки, где к следующему: Получим окно безумно грунты (чтобы заменить текущее окно Дэв: 2 ГБ оперативной памяти в
E6550 Core2 Duo
); это позволит репро аварии вызывает неправильное поведение при работе под мощную среду отладки; или Операторы переписать
new
и
delete
использовать
VirtualAlloc
и
VirtualProtect
в знак памяти только для чтения, как только с этим покончено. Работать под
MSVC6
и ОС ловить плохих парней, кто пишет на освобожденной памяти. Да, это знак отчаяния: кто, черт возьми, переписывает
new
и
delete
?! Я интересно, если это будет так медленно, как под очистить и соавт. И, нет: доставка с очистки инструментария встроенный не вариант. Коллега просто шел мимо и спросил: "переполнение стека? Теперь мы собираемся переполнения стека?!?" А теперь вопрос: как мне найти коррупционер кучи? Обновление: балансировка
new[]
и
delete[]
, похоже, долгий путь к решению проблемы. Вместо 15 минут, приложение теперь идет около двух часов до аварии. Еще не существует. Любые дальнейшие предложения? Кучи коррупция сохраняется. Обновление: релиз-сборку в Visual Studio 2008 С, кажется, значительно лучше; ток подозрение лежит на осуществление
STL
, который поставляется с
VS98
. Воспроизвести проблему.
Dr Watson
будет производить свалку, что может быть полезным в дальнейшем анализе. Я возьму на заметку, но я обеспокоен тем, что доктор Ватсон будет только подставляли постфактум, а не когда куча становится растоптала. Еще одну попытку может быть, используя
WinDebug
как инструмент отладки, который является достаточно мощным и в то же время и легкий. Есть то, что на данный момент, опять же: не сильно помогает пока что-то пойдет не так. Я хочу поймать вандала с поличным. Может быть, эти инструменты позволят вам, по крайней мере, чтобы сузить проблему для определенного компонента. Я не держу большие надежды, но отчаянные времена требуют... И вы уверены, что все компоненты проекта имеют правильные настройки среды выполнения библиотек (
C/C   tab
, генерация кода категории в vs 6.0 настройках проекта)? Нет, я не, и я потрачу пару часов завтра проходя через рабочую область (58 проектов) и проверять они все компиляция и связывание с соответствующими флагами. Обновление: это заняло 30 секунд. Выберите все проекты в диалоговом
Settings
, снимите, пока вы не найдете проект(ы), которые не имеют правильные настройки (они все были правильными настройками).
0 голосов
от
Мой первый выбор был бы специализированный инструмент кучи, например pageheap.exe. Переопределение new и delete могут быть полезны, но это не поймать allocs совершенных низкоуровневый код. Если это то, что вы хотите, лучше обходить
lows с помощью Microsoft объезды.

Также логические проверки, такой как: проверка среды выполнения библиотек матч (выпуск и отладка многопоточных и однопоточных, dll файлы и статическая библиотека), искать плохое удаляет (например, удалить где удалить [] должны были использоваться), убедитесь, что вы не можете смешивать и сочетать ваш allocs.

Попробуйте также выборочно отключать ниток и посмотреть, если проблема исчезнет.

Что значит стек вызовов и т. д. выглядят как на момент первого исключения?
0 голосов
от
У меня же проблемы в моей работе (мы также используем
VC6
иногда). И не существует простого решения для этого. У меня только несколько советов: Попробуйте с автоматическим аварийные дампы на производство машины (см. Процесс самосвал). Мой опыт говорит д-р Ватсон не подходит для сброса. Удалить все поймать(...) из вашего кода. Часто они скрывают серьезные исключения памяти. Проверить расширенный отладки Windows - есть много отличных советов для проблем, как ваша. Я рекомендую это всем сердцем. Если вы используете
STL
попробовать
STLPort
и проверка сборки. Неверный итератор это ад. Удачи. Проблемы как у тебя уйти месяцы, чтобы решить. Будьте готовы к этому...
0 голосов
от
Запустить оригинальное приложение с
ADplus 
Когда проблема памяти всплывает вы получить хороший большую свалку.

Вы можете проанализировать дамп, чтобы понять, что ячейки памяти был поврежден.
Если Вам ПОВЕЗЕТ перезаписать память-это уникальная строка, вы можете выяснить, откуда он взялся. Если вам не повезло, вам придется копаться в куче win32
и фигура какая была оригинальная характеристика памяти. (куча -X может помочь) После того, как вы знаете, что было запутано, можно ограничить использование программы appverifier с помощью специальных настроек куча. т. е. вы можете указать, что
DLL
вас монитор, или какой размер ассигнований на монитор. Надеюсь, этого будет достаточно быстрого контроля, чтобы поймать преступника. По моему опыту, я никогда не нуждался в полный режим проверки кучи, но я провел много времени, анализируя дамп(Ы) и обзор источников. П. С.: Вы можете использовать DebugDiag для анализа дампов. Это может указывать на
DLL
владельцам поврежденных кучи, и даст вам другие полезные детали.
0 голосов
от
У нас были довольно удачи на написание собственных функций malloc и Free. В производство, они просто называют стандартным malloc и Free, но в режиме отладки, они могут делать все, что захочешь. Также у нас есть простой базовый класс, который ничего не делает, но переопределить операторы new и Delete, чтобы использовать эти функции, то любой класс писать можно просто наследовать от этого класса. Если у вас есть тонна кода, это может быть большая работа, чтобы заменить вызовы malloc и free в новый malloc и free (не забудьте realloc!), но в долгосрочной перспективе это очень полезно. В книге Стив Магуайр управления (очень рекомендуется), есть примеры отладки вещи, которые вы можете сделать в эти процедуры, как: Отслеживать ассигнования для поиска утечек Выделить больше памяти, чем необходимо, и поставить маркеры в начале и в конце памяти -- в произвольной программе, вы можете обеспечить эти маркеры еще есть остановлюсь на памяти с маркером на выделение (чтобы найти использование неинициализированной памяти) и по свободным (чтобы найти использование свободного что памяти) Другая хорошая идея, чтобы не использовать такие вещи, как
strcpy
,
strcat
, или
sprintf
-всегда используйте
strncpy
,
strncat
, и
snprintf
. Мы написали наши собственные версии эти, а также, чтобы убедиться, что мы не пишем с конца буфера, и они имеют слишком много проблем.
0 голосов
от
Вы должны атаковать эту проблему с runtime и статического анализа. Для статического анализа рассмотреть возможность сбора с PREfast (
cl.exe /analyze
). Он обнаруживает несоответствие
delete
и
delete[]
, переполнения буфера и массой других проблем. Однако будьте готовы к тому, чтобы пробираться сквозь многие килобайт л6 предупреждение, особенно если ваш проект еще
L4
не зафиксировал. PREfast доступен с системой визуальной студии команда и, судя по всему, как часть пакета SDK для Windows.
0 голосов
от
Кажущаяся случайность повреждению памяти, звучит очень похоже на проблему синхронизации потоков - ошибка воспроизводится в зависимости от скорости машины. Если объекты (chuncks памяти) распределяются между потоками и синхронизации (критические секции, мьютексы, семафоры, другие) примитивы не на в-класс (на объект, на класс), то можно прийти к ситуации, когда класс (кусок памяти) удаляются / освобожден во время использования, или использовать после удалил / освободил. Как это проверить, вы можете добавить примитивы синхронизации для каждого класса и метода. Это сделает ваш код медленнее, потому что многие объекты придется ждать друг друга, но если это исключает повреждение кучи, кучи-проблема коррупции станет оптимизация кода один.
0 голосов
от
Это в нехватке памяти? Если так, то может быть, что новое-это возвращение
NULL
, а не бросать с std::bad_alloc. Старше
VC  
компиляторы не правильно это реализовать. Есть статья о наследии ошибок выделения памяти сбой
STL
приложения, созданные с
VC6
.
0 голосов
от
Вы пробовали старые билды, но есть причина, по которой вы не можете идти дальше в историю репозитория и видя, когда ошибка была введена? В противном случае, я предложил бы добавить простую регистрацию какую-то, чтобы помочь отследить проблему, хотя я в недоумении, что конкретно вы могли бы хотеть войти. Если вы можете выяснить, что именно может вызывать эту проблему, через Google и документации для исключения вы получаете, может быть это даст дополнительную информацию о том, что искать в коде.
0 голосов
от
Моим первым действием будет выглядеть следующим образом: Построить двоичные файлы в "релиз" версии, но и создание отладочной информации файл (вы найдете эту возможность в настройках проекта). Использовать "Доктор Ватсон" в качестве отладчика по умолчанию (команду drwtsn32 -I) на машине, на которой вы хотите воспроизвести проблему. Repdroduce проблема. Доктор Уотсон будет производить свалку, что может быть полезным в дальнейшем анализе. Еще попробовать можно через WinDebug как инструмент отладки, который является достаточно мощным и в то же время и легкий. Может быть, эти инструменты позволят вам, по крайней мере, чтобы сузить проблему для определенного компонента. И вы уверены, что все компоненты проекта имеют правильные настройки среды выполнения библиотек (вкладка с/С создание кода категории в vs 6.0 настройках проекта)?
...