#visual-studio-2010 #visual-c
#visual-studio-2010 #visual-c
Вопрос:
Моему приложению необходимо освободить очень большую хэш-таблицу, и она невероятно медленная в режиме отладки, настолько медленная, что я не могу реально работать с ней … но в режиме выпуска у меня вообще нет символов отладки.. Мне нужно отладить исполняемый файл и понять, что я должен иметь возможность связать его с версиями выпуска библиотек crt. Я сделал это, изменив свои параметры «генерации кода», чтобы использовать «многопоточную DLL», а не «многопоточную отладочную DLL», однако, когда я устанавливаю точку останова в своей процедуре освобождения хэш-таблицы и выполняю ее до фактического бесплатного вызова, она использует функцию в отладочной DLL.
Что-нибудь еще, что я могу попробовать? Является ли это лучшим вариантом для работы с конфигурацией выпуска и попыткой заставить ее генерировать символы для материала, который мне действительно нужно отлаживать?
(кстати, по сравнению с 2010)
Ответ №1:
У вас могут быть символы отладки, несмотря на использование release CRT и включение всех оптимизаций. На самом деле это то, что используется Visual C по умолчанию в конфигурации выпуска (см. Свойства проекта / Свойства конфигурации / C / C / Общий формат / Информация об отладке; и Компоновщик / Отладка / Генерировать информацию об отладке). Пожалуйста, обратите внимание, что оптимизированный код может быть сложнее отлаживать — порядок инструкций может быть изменен, а некоторые части могут быть оптимизированы полностью, что приводит к некоторому неожиданному поведению при пошаговом просмотре кода.
Кстати, чтобы отключить отладочный CRT, недостаточно просто изменить «Многопоточная отладочная DLL (/ MDd)» на «Многопоточная DLL (/ MD)», вам также необходимо удалить _DEBUG
из определений препроцессора.
При этом медлительность, с которой вы сталкиваетесь, может вообще не быть следствием вашей программы — это может быть артефакт отладчика (т. Е. медлительность чтения больших структур данных с целью их отображения в пользовательском интерфейсе отладчика). Пожалуйста, попробуйте запустить свою программу (конфигурацию отладки или выпуска — это не имеет большого значения) вне debugger и посмотрите, имеет ли это значение.
Если это так, и вы не можете уменьшить свою хэш-таблицу только для целей отладки, вам придется либо прибегнуть к «отладке printf» (т. Е. Вручную вставить диагностику), либо, возможно, попробовать удаленную отладку.
Комментарии:
1. К сожалению, последнее верно; даже отладочная сборка работает нормально вне отладчика. Я, вероятно, просто присоединюсь к исполняемому файлу, как только хэш-таблица будет освобождена.
Ответ №2:
Добавьте это в начале stdafx.h или определите его как макрос предварительного процессора для вашей отладочной сборки:
#define _SECURE_SCL 0
Это приведет к следующему, что ускорит выполнение вашего кода в режиме отладки:
Все стандартные итераторы не отмечены (итераторы могут выходить за границы контейнера, что приводит к неопределенному поведению). Для стандартных функций с отмеченными формами будет использоваться непроверенная форма функции (см. Список ниже).
Если выходной итератор является проверенным итератором:
- Вы получите проверенное поведение при вызовах стандартной функции (std::copy, например).
- Вы получите проверенное поведение при вызовах проверяемой функции (например, stdext::checked_copy).
- Вы получите проверенное поведение при вызовах непроверенной функции (например, stdext::unchecked_copy).
Если выходной итератор является непроверенным итератором:
- Вы получите неконтролируемое поведение при вызовах стандартной функции (std::copy, например).
- Вызовы проверяемой функции (например, stdext::checked_copy) приведут к появлению предупреждений компилятора.
- Вы получите непроверенное поведение при вызовах непроверенной функции (например, stdext::unchecked_copy).
Вы можете прочитать больше об этом поведении в разделе Проверенные итераторы MSDN. Обычно вы хотите, чтобы проверенные итераторы были включены для отладочных сборок, но есть определенные приложения, которые выполняют множество операций за короткий промежуток времени, где они могут стать помехой.
Комментарии:
1. спасибо, но я не думаю, что это относится к моему хэшу free, который является стандартным для цикла