views:

396

answers:

2

I'm trying to see the value of a variable, but the debugger shows me a value of "????". This seems to happen to Currency variables, but not other types (Double and enumerated types are ok).

I'm debugging on Windows XP SP 3 using Delphi 10 Update 2.

The process I'm using is:

  1. Build the project in the BDS IDE.
  2. Copy the exe to the directory where the service is expected to live.
  3. Start the service. It's running locally, I'm not trying to remote debug.
  4. Attach to the service process (Run | Attach to Process).
  5. The process stops at my breakpoint(s), so the attaching seems to be ok.
  6. Evaluate the value of a variable.

To evaluate the variable I've tried:

  • Hovering the mouse over the variable name. Usually this displays the value, but in this case it doesn't show anything (i.e. no pop-up).
  • Right-click the variable name, Debug, Evaluate/Modify shows a value of ????.
  • Right-click the variable name, Debug, Add Watch at Cursor shows a value of ????.
  • The Local Variables window shows a value of {.

It seems to be related to Currency, so I tried changing the variable type from Currency to Double, and when I re-ran the test the debugger showed the correct value.

The variables I'm trying to evaluate is a local variable with nothing tricky being done, e.g.:

  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;

The Project Options I think might be relevant are:

  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

Can anyone suggest what's causing this and how I can make it work?

Edit: I tried a test program consisting of a form with a button that formats a Currency variable onto a label. Debugging as described above (attach to process etc), the debugger showed the correct value. Now wondering if the problem is specific to debugging a service ...

+2  A: 

Hm - it works for me in Delphy 2006. I did only create a small console app though. A suggestion for a workaround - cast the variable into an int64 inside the debugger. It should show the value multiplied by 10000.

Tobias Langner
Thanks Tobias, I tried your suggestion and the debugger said "E2268 Call to undefined function 'Int64'" which made me think I had bigger problems, and eventually led me to discover my symbols weren't in the right place (see my answer for explanation). Thanks for taking the time to do a test app.
WileCau
+2  A: 

The problem seems to be due to not having program.rsm file in the same directory as program.exe (step 2 of my process copied the exe to somewhere else).

Program.rsm is generated when Include remote debug symbols is enabled. I had it checked, but didn't think it was relevant because I was debugging locally. I'd only ever used program.rsm when debugging remotely, and it didn't occur to me that debugging locally but in a different directory is kind of "remote".

So there appear to be three possible solutions:

  • Set the path to program.rsm in:
    Project | Options | Debugger | Symbol Tables | Debug symbols search path.

  • Set the output directory in:
    Project | Options | Directories/Conditionals | Output directory.

  • Copy program.rsm to the same directory as program.exe before debugging.

It's still a mystery why the Currency variables were the only ones affected.

WileCau