Package: g++
Version: 4:6.3.0-1
Severity: normal
Dear maintainers,
I observed some unexpected behavior with g++ (4:6.3.0-1) and GDB (7.12-6) on Stretch:
Please have a look at the attached source file, which is the minimal example I
could come up with to demonstrate the issue.
We compile it (I tested on AMD64 with and without `-m32`, which made no
difference):
g++ -std=c++11 -Wall -Wextra -Wno-unused-but-set-variable -Wno-unused-parameter -O0 -g -o demo demo.cc
… and execute it with GDB. Now we set a breakpoint on `func()`:
(gdb) b func
Breakpoint 1 at 0xa63: file demo.cc, line 20.
This already seems strange, as line 20 clearly is the `return` statement of
`func()` and not its begin!
But let's see what actually is at address 0xa63:
(gdb) disassemble func
Dump of assembler code for function func(int, ...):
0x0000000000000a00 <+0>: push %rbp
0x0000000000000a01 <+1>: mov %rsp,%rbp
0x0000000000000a04 <+4>: push %r13
0x0000000000000a06 <+6>: push %r12
0x0000000000000a08 <+8>: push %rbx
0x0000000000000a09 <+9>: sub $0x108,%rsp
0x0000000000000a10 <+16>: mov %edi,-0x114(%rbp)
0x0000000000000a16 <+22>: mov %rsi,-0xc8(%rbp)
0x0000000000000a1d <+29>: mov %rdx,-0xc0(%rbp)
0x0000000000000a24 <+36>: mov %rcx,-0xb8(%rbp)
0x0000000000000a2b <+43>: mov %r8,-0xb0(%rbp)
0x0000000000000a32 <+50>: mov %r9,-0xa8(%rbp)
0x0000000000000a39 <+57>: test %al,%al
0x0000000000000a3b <+59>: je 0xa63 <func(int, ...)+99>
0x0000000000000a3d <+61>: movaps %xmm0,-0xa0(%rbp)
0x0000000000000a44 <+68>: movaps %xmm1,-0x90(%rbp)
0x0000000000000a4b <+75>: movaps %xmm2,-0x80(%rbp)
0x0000000000000a4f <+79>: movaps %xmm3,-0x70(%rbp)
0x0000000000000a53 <+83>: movaps %xmm4,-0x60(%rbp)
0x0000000000000a57 <+87>: movaps %xmm5,-0x50(%rbp)
0x0000000000000a5b <+91>: movaps %xmm6,-0x40(%rbp)
0x0000000000000a5f <+95>: movaps %xmm7,-0x30(%rbp)
0x0000000000000a63 <+99>: mov %rsp,%rax
0x0000000000000a66 <+102>: mov %rax,%rbx
This clearly is not the `return` statement from line 20, but the end of the
prologue. So the breakpoint appears to be set at the right location and only
displayed wrongly.
Let's confirm:
(gdb) r
Starting program: /home/felix/demo
Breakpoint 1, func (a=1) at demo.cc:20
20 return 0;
(gdb) p $pc
$1 = (void (*)(void)) 0x555555554a63 <func(int, ...)+99>
(gdb) s
5 size_t arg_num = 2;
(gdb) p $pc
$2 = (void (*)(void)) 0x555555554a69 <func(int, ...)+105>
(gdb) s
7 int arg_vals[arg_num];
(gdb) finish
Run till exit from #0 func (a=1) at demo.cc:7
a is: 1
main (argc=1, argv=0x7fffffffe348) at demo.cc:25
25 }
Value returned is $3 = 0
If I'd have to guess, I'd say the wrong line number ended up in the debug
symbols.
Note that this also happens when explicitly trying to set a breakpoint
on the `return` statement:
(gdb) b demo.cc:20
Breakpoint 1 at 0xa63: file demo.cc, line 20.
(gdb) r
Starting program: /home/felix/demo
Breakpoint 1, func (a=1) at demo.cc:20
20 return 0;
(gdb) s
5 size_t arg_num = 2;
(gdb) finish
Run till exit from #0 func (a=1) at demo.cc:5
a is: 1
main (argc=1, argv=0x7fffffffe348) at demo.cc:25
25 }
Value returned is $1 = 0
I have also checked the behavior on Jessie with (g++ 4:4.9.2-2,
GDB 7.7.1+dfsg-5) and everything seems alright there.
However, if I copy the binary from Strech over to Jessie, the error still
occurs, so I believe this is a bug in g++ rather than in GDB.
Best regards,
FelixAttachment:
demo.cc
Description: Binary data