| |
 | Posted by chmike | Permalink Reply |
|
chmike 
| 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.
|