[lldb-dev] breakpoint command

Michael Sartain mikesart at valvesoftware.com
Wed Jun 19 14:49:09 PDT 2013

On Tue, Jun 18, 2013 at 6:58 PM, <jingham at apple.com> wrote:

> I don't know what more recent gcc's do, but they used to omit the
> prologue_end marker, and instead use the convention that the first line
> table entry for the function is the beginning of the function, and the
> second is the end of the prologue.  gdb has relied on that for a long long
> time (in absence of the prologue_end and back to the stabs days when there
> was no such thing.)

I think Jim is absolutely right here with his very useful reply. It looks
like gdb ignores the prologue end stuff entirely (which makes sense since
it doesn't look like gcc outputs it), and it sets the breakpoint on the
second line table entry. But in this case:

0x00400764  [   6, 0] NS uri: "/home/mikesart/data/src/blah2/blah.cpp"
> 0x00400796  [   6, 0] NS
> 0x004007bd  [  10, 0] NS
> 0x004007ea  [  11, 0] NS

gdb is treating 0x004007bd as the second line table entry, and lldb is
treating 0x00400796 as the second. This is pretty clear with the
disassembly output down below.

The problem in this case is that second block with the sse movaps
instructions isn't run, so the breakpoint is never hit.

So I think the change would be in how lldb handles what the second line
table entry is? Ie, skip duplicate entries.

(lldb) disassemble -n myprintf -m
blah`myprintf(char const*, ...) at blah.cpp:6
   5    myprintf (const char *format, ...)
   6    {
   7      va_list arg;
blah[0x400764]:  pushq  %rbp
blah[0x400765]:  movq   %rsp, %rbp
blah[0x400768]:  subq   $224, %rsp
blah[0x40076f]:  movq   %rsi, -168(%rbp)
blah[0x400776]:  movq   %rdx, -160(%rbp)
blah[0x40077d]:  movq   %rcx, -152(%rbp)
blah[0x400784]:  movq   %r8, -144(%rbp)
blah[0x40078b]:  movq   %r9, -136(%rbp)
blah[0x400792]:  testb  %al, %al
blah[0x400794]:  je     0x4007b6                  ; myprintf(char const*,
...) + 82 at blah.cpp:6
blah`myprintf(char const*, ...) + 50 at blah.cpp:6
   5    myprintf (const char *format, ...)
   6    {
   7      va_list arg;
blah[0x400796]:  movaps %xmm0, -128(%rbp)
blah[0x40079a]:  movaps %xmm1, -112(%rbp)
blah[0x40079e]:  movaps %xmm2, -96(%rbp)
blah[0x4007a2]:  movaps %xmm3, -80(%rbp)
blah[0x4007a6]:  movaps %xmm4, -64(%rbp)
blah[0x4007aa]:  movaps %xmm5, -48(%rbp)
blah[0x4007ae]:  movaps %xmm6, -32(%rbp)
blah[0x4007b2]:  movaps %xmm7, -16(%rbp)
blah[0x4007b6]:  movq   %rdi, -216(%rbp)
blah`myprintf(char const*, ...) + 89 at blah.cpp:10
   10     va_start (arg, format);
   11     done = vfprintf (stdout, format, arg);
blah[0x4007bd]:  movl   $8, -208(%rbp)
blah[0x4007c7]:  movl   $48, -204(%rbp)
blah[0x4007d1]:  leaq   16(%rbp), %rax
blah[0x4007d5]:  movq   %rax, -200(%rbp)
blah[0x4007dc]:  leaq   -176(%rbp), %rax
blah[0x4007e3]:  movq   %rax, -192(%rbp)
blah`myprintf(char const*, ...) + 134 at blah.cpp:11

(gdb) disassemble /m myprintf
Dump of assembler code for function myprintf(char const*, ...):
6       {
   0x0000000000400764 <+0>:     push   rbp
   0x0000000000400765 <+1>:     mov    rbp,rsp
   0x0000000000400768:  sub    rsp,0xe0
   0x000000000040076f:  mov    QWORD PTR [rbp-0xa8],rsi
   0x0000000000400776:  mov    QWORD PTR [rbp-0xa0],rdx
   0x000000000040077d:  mov    QWORD PTR [rbp-0x98],rcx
   0x0000000000400784:  mov    QWORD PTR [rbp-0x90],r8
   0x000000000040078b:  mov    QWORD PTR [rbp-0x88],r9
   0x0000000000400792:  test   al,al
   0x0000000000400794:  je     0x4007b6
   0x0000000000400796:  movaps XMMWORD PTR [rbp-0x80],xmm0
   0x000000000040079a:  movaps XMMWORD PTR [rbp-0x70],xmm1
   0x000000000040079e:  movaps XMMWORD PTR [rbp-0x60],xmm2
   0x00000000004007a2:  movaps XMMWORD PTR [rbp-0x50],xmm3
   0x00000000004007a6:  movaps XMMWORD PTR [rbp-0x40],xmm4
   0x00000000004007aa:  movaps XMMWORD PTR [rbp-0x30],xmm5
   0x00000000004007ae:  movaps XMMWORD PTR [rbp-0x20],xmm6
   0x00000000004007b2:  movaps XMMWORD PTR [rbp-0x10],xmm7
   0x00000000004007b6:  mov    QWORD PTR [rbp-0xd8],rdi
7         va_list arg;
8         int done;
10        va_start (arg, format);
   0x00000000004007bd:  mov    DWORD PTR [rbp-0xd0],0x8
   0x00000000004007c7:  mov    DWORD PTR [rbp-0xcc],0x30
   0x00000000004007d1:  lea    rax,[rbp+0x10]
   0x00000000004007d5:  mov    QWORD PTR [rbp-0xc8],rax
   0x00000000004007dc:  lea    rax,[rbp-0xb0]
   0x00000000004007e3:  mov    QWORD PTR [rbp-0xc0],rax
11        done = vfprintf (stdout, format, arg);
   0x00000000004007ea:  mov    rax,QWORD PTR [rip+0x20082f]        #
0x601020 <stdout@@GLIBC_2.2.5>
   0x00000000004007f1:  lea    rdx,[rbp-0xd0]
   0x00000000004007f8:  mov    rcx,QWORD PTR [rbp-0xd8]
   0x00000000004007ff:  mov    rsi,rcx
   0x0000000000400802:  mov    rdi,rax
   0x0000000000400805:  call   0x400670 <vfprintf at plt>
   0x000000000040080a:  mov    DWORD PTR [rbp-0xb4],eax
12        va_end (arg);
14        return done;
   0x0000000000400810:  mov    eax,DWORD PTR [rbp-0xb4]
15      }
   0x0000000000400816:  leave
   0x0000000000400817:  ret
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130619/1096af5a/attachment.html>

More information about the lldb-dev mailing list