Иногда разработчики используют небольшие методы для помощи в отладке, которые не используются в финальной версии программы. Один из таких примеров - метод AsString, который добавляется в список наблюдений (watches) для удобства отладки. В случае использования Delphi 2007, который не имеет встроенных визуализаторов, такой подход может быть особенно полезен.
Проблема
Рассмотрим пример программы на Object Pascal (Delphi), где определен класс TMyClass с методом AsString. В функции SomeTest хотелось бы наблюдать за значением AsString объекта aMC во время отладки, но компоновщик (linker) исключает этот метод, так как он не используется в коде программы.
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
type
TMyClass = class
F: integer;
function AsString: string;
end;
function TMyClass.AsString: string;
begin
Result := 'Test: '+IntToStr(F);
end;
function SomeTest(aMC: TMyClass): boolean;
begin
// Хотим наблюдать за aMC.AsString во время отладки!
Result := aMC.F > 100;
end;
var
X: TMyClass;
begin
X := TMyClass.Create;
try
X.F := 100;
if SomeTest(X)
then writeln('OK')
else writeln('Fail');
finally
X.Free;
end;
readln;
end.
Когда добавляем X.AsString в список наблюдений, получаем сообщение от компоновщика о том, что функция была исключена.
Решение
Для того чтобы компоновщик не исключал метод AsString, можно использовать инициализацию с помощью блока initialization. В этом блоке можно вызвать нужную функцию, и компоновщик не будет исключать её из сборки, даже если она не используется в коде программы.
initialization
exit;
TMyClass(nil).AsString;
end.
Также можно использовать директиву препроцессора для определения функции только в режиме отладки:
unit UnitA;
interface
{$DEFINE DEBUG}
function AsString: string;
implementation
function AsString: string;
begin
Result := 'Test: ';
end;
{$IFDEF DEBUG}
initialization
exit;
AsString;
{$ENDIF}
end.
Альтернативные способы
Существуют и другие способы включения методов для отладки. Например, можно сделать метод published, что позволит вызывать его в режиме отладки, не используя его в коде программы. Однако этот метод может повлиять на финальную сборку, так как published методы будут включены в интерфейс.
TMyClass = class
F: integer;
published
function AsString: string;
end;
Также в настройках 'Watch Properties' можно включить возможность вызова функций.
Заключение
Таким образом, для включения функций только для отладки в проектах на Delphi можно использовать инициализацию с помощью блока initialization и препроцессорные директивы, которые позволяют не вызывать методы в коде, но при этом не исключать их из сборки. Это позволяет разработчикам использовать дополнительные утилиты для отладки, не влияя на производительность финальной сборки программы.
Вопрос касается методов включения функций в проектах на Delphi, предназначенных исключительно для отладки, и не включаемых в финальную версию программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.