www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 15189] New: Dwarf debug info is inaccurate

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

          Issue ID: 15189
           Summary: Dwarf debug info is inaccurate
           Product: D
           Version: D2
          Hardware: All
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: yazan.dabain gmail.com

void main()
{
  Test a;                   // line 3

  /* place anything here */
  import std.stdio;
  int x = 12;
  int y = 13;
  int z = x + y;
  writeln(z);
  /* to here */

  a.blow();                 // line 13
}

struct Test
{
  void blow()
  {
    throw new Exception("");  // line 20
  }
}

----

Stack trace:

object.Exception main.d(20)
----------------
main.d:20 void main.Test.blow() [0x4351ab]
main.d:3 _Dmain [0x43511e]
??:? _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv [0x43691e]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).tryExec(scope void delegate()) [0x436874]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).runAll() [0x4368da]
??:? void rt.dmain2._d_run_main(int, char**, extern (C) int
function(char[][])*).tryExec(scope void delegate()) [0x436874]
??:? _d_run_main [0x4367d1]
??:? main [0x4358cf]
??:? __libc_start_main [0x611e3a3f]

----

The stack trace at 0x43511e should point at line 13 instead of line 3.
Output from addr2line matches file/line for each address. So the bug should be
in the dwarf data itself.

----

Output from `readelf --debug-dump=decodedline main`:

CU: main.d:
File name                            Line number    Starting address

./main.d:[++]
main.d                                         1            0x4350e8
main.d                                         3            0x4350f1
main.d                                         7            0x4350f8
main.d                                         8            0x435100
main.d                                         9            0x435108
main.d                                         7            0x435108
main.d                                         8            0x435108
main.d                                        10            0x43510e
main.d                                         9            0x43510e
main.d                                        13            0x435116
main.d                                         3            0x435116

main.d                                        14            0x435121


./main.d:[++]
main.d                                        18            0x435128

main.d                                        20            0x435169

main.d                                        21            0x4351ac

----

Output from `readelf --debug-dump=rawline main`:

 Line Number Statements:
  [0x000001c8]  Extended opcode 2: set Address to 0x4350e8
  [0x000001d3]  Set File Name to entry 1 in the File Name Table
  [0x000001d5]  Special opcode 5: advance Address by 0 to 0x4350e8 and Line by
0 to 1
  [0x000001d6]  Special opcode 133: advance Address by 9 to 0x4350f1 and Line
by 2 to 3
  [0x000001d7]  Special opcode 107: advance Address by 7 to 0x4350f8 and Line
by 4 to 7
  [0x000001d8]  Special opcode 118: advance Address by 8 to 0x435100 and Line
by 1 to 8
  [0x000001d9]  Special opcode 118: advance Address by 8 to 0x435108 and Line
by 1 to 9
  [0x000001da]  Special opcode 3: advance Address by 0 to 0x435108 and Line by
-2 to 7
  [0x000001db]  Special opcode 6: advance Address by 0 to 0x435108 and Line by
1 to 8
  [0x000001dc]  Special opcode 91: advance Address by 6 to 0x43510e and Line by
2 to 10
  [0x000001dd]  Special opcode 4: advance Address by 0 to 0x43510e and Line by
-1 to 9
  [0x000001de]  Special opcode 121: advance Address by 8 to 0x435116 and Line
by 4 to 13
  [0x000001df]  Advance Line by -10 to 3
  [0x000001e1]  Copy
  [0x000001e2]  Advance Line by 11 to 14
  [0x000001e4]  Advance PC by 11 to 0x435121
  [0x000001e6]  Copy
  [0x000001e7]  Advance PC by 7 to 0x435128
  [0x000001e9]  Extended opcode 1: End of Sequence

  [0x000001ec]  Extended opcode 2: set Address to 0x435128
  [0x000001f7]  Set File Name to entry 1 in the File Name Table
  [0x000001f9]  Advance Line by 17 to 18
  [0x000001fb]  Copy
  [0x000001fc]  Advance Line by 2 to 20
  [0x000001fe]  Advance PC by 65 to 0x435169
  [0x00000200]  Copy
  [0x00000201]  Advance Line by 1 to 21
  [0x00000203]  Advance PC by 67 to 0x4351ac
  [0x00000205]  Copy
  [0x00000206]  Advance PC by 4 to 0x4351b0
  [0x00000208]  Extended opcode 1: End of Sequence

--
Oct 11 2015