www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16977] New: bad debug info for function default arguments

https://issues.dlang.org/show_bug.cgi?id=16977

          Issue ID: 16977
           Summary: bad debug info for function default arguments
           Product: D
           Version: D2
          Hardware: All
                OS: Windows
            Status: NEW
          Keywords: symdeb
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: r.sagitario gmx.de

When compiling this code with debug information for OMF:



void main()
{
    foo(1, 2);
}

size_t foo(int x, int y, int z = 3)
{
    return x;
}

it results in line number info displayed by the debugger like this:

     1: 
     2: void main()
00402010 55                   push        ebp  
00402011 8B EC                mov         ebp,esp  
     3: {
     4:     foo(1, 2);
00402013 6A 01                push        1  
     3: {
     4:     foo(1, 2);
00402015 6A 02                push        2  
     6: 
     7: size_t foo(int x, int y, int z = 3)
00402017 B8 03 00 00 00       mov         eax,3  
0040201C E8 07 00 00 00       call        cvdefarg foo (0402028h)  
00402021 31 C0                xor         eax,eax  
     5: }
00402023 5D                   pop         ebp  
00402024 C3                   ret  

This has issues:

- loading the default argument inherits the location of the function
declaration, so the debugger is prematurely redirected to the source line of
the function before actually calling it. The user thinks the function is
already called, but using "step until return" will stop after returning from
the calling function instead.

- the return address on the stack is considered at line 7, i.e. at the function
declaration. This makes the call stack pretty unusable.

Compiling for COFF is even worse because there is a (gratuitious?) limitation
on increasing line numbers.

--
Dec 17 2016