Delphi отладчик показывает ???? для валютных переменных - PullRequest
1 голос
/ 25 августа 2009

Я пытаюсь увидеть значение переменной, но отладчик показывает мне значение «????». Похоже, это происходит с переменными Currency, но не с другими типами (допустимы двойные и перечислимые типы).

Я отлаживаюсь в Windows XP SP 3 с использованием Delphi 10 Update 2.

Процесс, который я использую:

  1. Сборка проекта в BDS IDE.
  2. Скопируйте exe-файл в каталог, где ожидается использование службы.
  3. Запустить сервис. Это работает локально, я не пытаюсь удаленной отладки.
  4. Присоединить к процессу обслуживания (Выполнить | Присоединить к процессу).
  5. Процесс останавливается на моих точках останова, поэтому присоединение, кажется, в порядке.
  6. Оценить значение переменной.

Чтобы оценить переменную, которую я пробовал:

  • Наведите указатель мыши на имя переменной. Обычно это отображает значение, но в этом случае ничего не отображается (т.е. без всплывающего окна).
  • Щелкните правой кнопкой мыши имя переменной, Debug, Evaluate / Modify покажет значение ????.
  • Щелкните правой кнопкой мыши имя переменной, Debug, Add Watch at Cursor показывает значение ????.
  • В окне Local Variables отображается значение {.

Похоже, что это связано с Currency, поэтому я попытался изменить тип переменной с Currency на Double, и при повторном запуске теста отладчик показал правильное значение.

Переменные, которые я пытаюсь оценить - это локальная переменная, которая не делает ничего сложного, например ::

  function FooBar: Boolean;
  var
    foo: Currency;
    bar: Double;
  begin
    foo := 0; // Breakpoint next line, evaluate foo shows "????"
    bar := 0; // Breakpoint next line, evaluate bar shows "0"
    ... 
  end;

Варианты проекта, которые, я думаю, могут быть актуальны:

  Compiler
    Code Generation
      Optimization = Off
      Stack frames = Off
      Pentium-safe FDIV = Off
    Syntax options
      Strict var-strings = On
      Complete boolean eval = Off
      Extended syntax = On
      Typed @ operator = Off
      Open parameters = On
      Huge strings = On
      Assignable typed constants = Off
    Runtime Errors
      Range Checking = On
      I/O Checking = On
      Overflow Checking = On
    Debugging
      Debug Information = On
      Local Symbols = On
      Debug Info = On
        Definitions Only = On
      Assertions = On
      Use Debug DCUs = Off
  Linker
      Map file = Detailed
      Linker output = Generate DCUs
      Exe and DLL options
        Include TD32 debug info = On
        Include remote debug symbols = On

Кто-нибудь может подсказать, что вызывает это и как я могу заставить его работать?

Edit: Я попробовал тестовую программу, состоящую из формы с кнопкой, которая форматирует переменную Currency на этикетке. При отладке, как описано выше (присоединение к процессу и т. Д.), Отладчик показал правильное значение. Теперь интересно, если проблема связана с отладкой службы ...

Ответы [ 2 ]

2 голосов
/ 25 августа 2009

Кажется, проблема в том, что файл program.rsm не находится в том же каталоге, что и program.exe (шаг 2 моего процесса скопировал exe-файл куда-то еще).

Program.rsm генерируется при включении Include remote debug symbols. Я проверил это, но не думал, что это актуально, потому что я отлаживал локально. Я когда-либо использовал program.rsm только при удаленной отладке, и мне не приходило в голову, что отладка локально, но в другом каталоге, является своего рода «удаленной».

Таким образом, существует три возможных решения:

  • Установите путь к program.rsm in:
    Project | Options | Debugger | Symbol Tables | Debug symbols search path.

  • Установить выходной каталог в:
    Project | Options | Directories/Conditionals | Output directory.

  • Перед отладкой скопируйте program.rsm в тот же каталог, что и program.exe.

До сих пор остается загадкой, почему переменные Currency были затронуты только.

2 голосов
/ 25 августа 2009

Хм - у меня это работает в Delphy 2006. Я только создал небольшое консольное приложение. Предложение для обходного пути - приведите переменную в int64 внутри отладчика. Он должен показать значение, умноженное на 10000.

...