воскресенье, 4 июля 2010 г.

Хак №2: Исправление номеров строк в System.pas после обновления D7.1

Это перевод Hack #2: Fixing System.pas line numbers after D7.1 update. Автор: Hallvard Vassbotn.

В 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, влияющих на номера строк.
Примечание: на самом деле, модуль System был обновлён - ради исправления бага с размером буфера в 1 Кб в LoadResString.

1 комментарий:

  1. Можно обойтись даже без удаления текста GPL, всё-таки это нарушение лицензии, как-никак ;).

    В секции интерфейса, начиная со строки 1201, между заголовками функций _Halt0 и Mark есть как раз 8 пустых строк (будто их там специально кто-то оставил).

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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