В newsgroups было обсуждение, что после установки обновления Delphi 7.1 возникает несоответствие между исправленным System.dcu и оригинальным исходником System.pas.
Проблема возникает, когда вы пытаетесь войти (step into) в код RTL из модуля System. К примеру, создайте новый консольный проект (File/New/Other/Console Application) и добавьте следующий высоко-технологичный код:
program Project1; {$APPTYPE CONSOLE} begin Writeln('Look - no hands, ma!'); end.Теперь подключите модули RTL/VCL с отладочной информацией - включением Project/Options/Compiler/Use Debug DCUs. Установите курсор на строчку с Writeln и нажмите F4 для прогона программы до курсора (предполагая, что вы имеете стандартные настройки клавиатуры). Затем нажмите F7 для step into в код. Если у вас установлено обновление D7.1, то вы окажетесь в конце процедуры _LStrOfChar внутри System.pas. Другими словами, вы потерялись.
Вы также увидите, что синие точки, которые указывают скомпилированные строки, не находятся на своих местах. Всё это - типичные признаки несоответствия между исходником и его скомпилированным вариантом. Так что пока Borland не даст нам правильную версию System.pas для этого обновления - мы встали.
Или нет? Хакеры вроде нас не любят сидеть сложа руки, объявив поражение. Если вы посмотрите чуть более внимательно на смещённые синие точки и неверно спозиционированный курсор в System.pas (он должен находится в Write0LString - на несколько строк ниже), то мы быстро сможем определить на сколько строк у нас сдвиг.
Чтобы всё исправить, нам надо удалить несколько строк - 8, если быть точным. Но что нам можно удалить? Если вы проскролитесь к началу модуля System.pas, то мы найдём интересный, но более-чем-бесполезный комментарий о лицензии GNU GPL. Как нам повезло: он занимает в точности 8 строк. Так что я просто его удалил. Теперь мы перезапускаем тестовое приложение. Вуаля - теперь мы оказались там, где и ожидали: в функции Write0LString! Здорово! Быстрое тестирование показывает, что и другие подпрограммы модуля System теперь тоже имеют корректные номера строк. Отлично!
Выводы:
- Оригинальный модуль System.pas из D7.0 включал в себя эти 8 дополнительных строк с информацией GNU GPL.
- Обновление D7.1 было очевидно скомпилировано по версии System.pas без этого комментария.
- Обновление D7.1 не включает обновлённый System.pas
- Кажется, не было сделано никаких других модификаций System.pas, влияющих на номера строк.
Можно обойтись даже без удаления текста GPL, всё-таки это нарушение лицензии, как-никак ;).
ОтветитьУдалитьВ секции интерфейса, начиная со строки 1201, между заголовками функций _Halt0 и Mark есть как раз 8 пустых строк (будто их там специально кто-то оставил).