2010-05-27 5 views
1

У меня есть устаревшее приложение C++, которое в самом своем воплощении мы строим с помощью make-файлов и инструмента командной строки VS2003. Я пытаюсь создать его, используя VS2008 и MsBuild. Сборка работает нормально, но я получаю ошибки, где раньше я никогда не видел ошибок, и переходить в отладчик VS2008 только смущает меня.Отладка Wierdness Visual Studio C++ 2008

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

Первоначально у меня был файл .csproj для каждой статической библиотеки и два .sln-файла, один для набора приложений (включая библиотеки, специфичные для набора) и один для разделяемых библиотек, не связанных с набором. Распространенные библиотеки были включены в ссылку, их проекты не были включены в набор приложений .sln.

Приложение создает экземпляр объекта из класса, определенного в одной из разделяемых библиотек. Класс имеет объект-член класса, который обертывает связанный список. Конструктор связанного класса списка устанавливает свой «главный» указатель на нуль.

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

Когда текущая строка в отладчике находится в исходном файле, принадлежащем статической библиотеке, указатель на голову содержит 0x00000000. Когда я вхожу в конструктор, я вижу, что указатель установлен на это значение, и когда я перейду в какой-либо другой метод класса, я вижу, что указатель на голову все еще содержит 0x00000000. Но когда я перехожу к методам, определенным в наборе приложений .sln, он содержит 0xCCCCCCCC. Это не похоже на перезапись. Он изменяется взад и вперед в зависимости от того, какой исходный файл я сейчас отлаживаю.

Таким образом, я включил проект совместно используемой библиотеки в пакет приложений .sln, и теперь я вижу указатель на голову, содержащий 0xCCCCCCCC все время. Похоже, что конструктор связанного списка не вызывается.

Итак, теперь я совершенно смущен. У кого-нибудь есть идеи?

+0

Включена ли статическая библиотека с оптимизацией? Если код скомпилирован с оптимизацией (например,/Ox), содержимое переменных может быть неправильным, или переменные могут вообще отсутствовать. Это может объяснить, почему вы видите разные значения при переходе через код. Если вы действительно хотите отлаживать, не используйте флаги оптимизации. – Patrick

ответ

5

Это распространенная ошибка, когда вы смешиваете и сопоставляете код, который был создан с различными версиями файлов заголовков CRT. Много изменений в период между 2003 и 2008 годами. Отладка итератора STL, например. Функция RTC (Run-Time Error Checks) будет другой, это источник значения 0xcccccccc, которое вы видите. Это означает «неинициализированная переменная». Вы видите это, потому что макет памяти структуры или класса не является одинаковым.

Вам придется перестроить эти библиотеки и убедиться, что они созданы с теми же настройками компилятора. Также не следует смешивать версии отладки и выпуска.

+0

Это похоже на это. Я попытался «перестроить» из IDE, и проблема не исчезла. Я использовал «make clean» со старыми make-файлами, удалив все двоичные файлы и выполнив сборку из среды IDE, и теперь все в порядке. Спасибо. –

Смежные вопросы