Hello,

I've notice that gdb was improperly displaying source lines with disassembled code. I looked at the assembly to check what is inlined and what not and the difference between the use of is and == in the machine code.

I then tested with objdump with a simple program and saw the same problem.

Here is the source code displayed with $ nl -da app.d and adding a white space in empty lines because it doesn't count empty lines even with option -ba.

 1    import std.stdio;
 2
 3    void main()
 4    {
 5        int a = 10;
 6
 7        a += 3;
 8
 9        ++a;
10
11        writefln("Value: %d", a);
12
13        writeln("Helloworld!");
14
15    }


This is the output of $ objdump --dwarf=decodedline app.o | less

CU: app.d:
Nom fichier                          Num ligne      Adresse début

./app.d:[++]
app.d 3 0 app.d 5 0x8 app.d 7 0xf app.d 9 0x13 app.d 11 0x16 app.d 9 0x20 app.d 13 0x28 app.d 15 0x3c
...

This is the output I get with $ objdump -d -S app > app.txt for the function _Dmain.

000000000043aae8 <_Dmain>:
import std.stdio;

void main()
  43aae8:       55                      push   %rbp
  43aae9:       48 8b ec                mov    %rsp,%rbp
  43aaec:       48 83 ec 10             sub    $0x10,%rsp
{
        int a = 10;
  43aaf0:       c7 45 f8 0a 00 00 00    movl   $0xa,-0x8(%rbp)

    a += 3;
  43aaf7:       83 45 f8 03             addl   $0x3,-0x8(%rbp)

    ++a;
  43aafb:       ff 45 f8                incl   -0x8(%rbp)

    writefln("Value: %d", a);
  43aafe:       ba 60 e5 46 00          mov    $0x46e560,%edx
  43ab03:       be 09 00 00 00          mov    $0x9,%esi
{
        int a = 10;

    a += 3;

    ++a;
  43ab08:       8b 7d f8                mov    -0x8(%rbp),%edi
43ab0b: e8 18 00 00 00 callq 43ab28 <_D3std5stdio19__T8writeflnTAyaTiZ8writeflnFNfAyaiZv>

    writefln("Value: %d", a);

    writeln("Helloworld!");
  43ab10:       ba 6a e5 46 00          mov    $0x46e56a,%edx
  43ab15:       bf 0b 00 00 00          mov    $0xb,%edi
  43ab1a:       48 89 d6                mov    %rdx,%rsi
43ab1d: e8 e6 9b 00 00 callq 444708 <_D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv>
  43ab22:       31 c0                   xor    %eax,%eax

}
  43ab24:       c9                      leaveq
  43ab25:       c3                      retq
  43ab26:       66 90                   xchg   %ax,%ax

000000000043ab28 <_D3std5stdio19__T8writeflnTAyaTiZ8writeflnFNfAyaiZv>:
}

As you can see the source lines don't match the assembly after ++a. I have the impression the error is in the debug line number table. The jump from 11 back to 9 look suspect. This is also where the source line display with disassembled code start to get bogus.

I get a similar output with gdb. I can't determine if the problem is in libdwarf or in the .debug info in the file because it's beyond my competence.

Is this normal ? I guess it confuses debuggers and render them useless.

Reply via email to