[lldb-dev] breakpoint command

Kopec, Matt matt.kopec at intel.com
Mon Jun 17 09:57:07 PDT 2013


In case you haven't looked at this yet, lldb has an option to skip the function prologue when setting function breakpoints. The setting is configurable via 'settings set target.skip-prologue false|true'. The default is true.

It looks like you have some debug info for libc.so since you are able to resolve some line numbers. My guess is it's getting this prologue offset information from the DWARF info.

Matt

On 2013-06-14, at 7:23 PM, Mike Sartain <mikesart at valvesoftware.com<mailto:mikesart at valvesoftware.com>> wrote:

lldb looks like it's adding some offset for the breakpoint command? The disassemble command looks like it works fine, but the breakpoint command is using an address fairly far into printf in this case. Before I head off to investigate, does anyone have any idea what might be going on here or suggestions on where to start?

Thanks.
 -Mike

(lldb) disassemble -n printf
libc.so.6`__printf at printf.c:30:
   0x7f961e2a2840:  subq   $216, %rsp

libc.so.6`__printf + 7 at printf.c:30:
   0x7f961e2a2847:  testb  %al, %al
   0x7f961e2a2849:  movq   %rsi, 40(%rsp)
   0x7f961e2a284e:  movq   %rdx, 48(%rsp)
   0x7f961e2a2853:  movq   %rcx, 56(%rsp)
   0x7f961e2a2858:  movq   %r8, 64(%rsp)
   0x7f961e2a285d:  movq   %r9, 72(%rsp)
   0x7f961e2a2862:  je     0x7f961e2a289b            ; __printf + 91 at printf.c:34
   0x7f961e2a2864:  movaps %xmm0, 80(%rsp) <=============== breakpoint gets set here
   0x7f961e2a2869:  movaps %xmm1, 96(%rsp)
   0x7f961e2a286e:  movaps %xmm2, 112(%rsp)
   0x7f961e2a2873:  movaps %xmm3, 128(%rsp)
   0x7f961e2a287b:  movaps %xmm4, 144(%rsp)
   0x7f961e2a2883:  movaps %xmm5, 160(%rsp)
   0x7f961e2a288b:  movaps %xmm6, 176(%rsp)
   0x7f961e2a2893:  movaps %xmm7, 192(%rsp)
   0x7f961e2a289b:  leaq   224(%rsp), %rax
   0x7f961e2a28a3:  movq   %rdi, %rsi
   0x7f961e2a28a6:  leaq   8(%rsp), %rdx
   0x7f961e2a28ab:  movl   $8, 8(%rsp)
   0x7f961e2a28b3:  movl   $48, 12(%rsp)
   0x7f961e2a28bb:  movq   %rax, 16(%rsp)
   0x7f961e2a28c0:  leaq   32(%rsp), %rax
   0x7f961e2a28c5:  movq   %rax, 24(%rsp)
   0x7f961e2a28ca:  movq   3556935(%rip), %rax
   0x7f961e2a28d1:  movq   (%rax), %rdi
   0x7f961e2a28d4:  callq  0x7f961e2979c0            ; _IO_vfprintf_internal at vfprintf.c:211
   0x7f961e2a28d9:  addq   $216, %rsp
   0x7f961e2a28e0:  ret

(lldb) b printf
Breakpoint 2: where = libc.so.6`__printf + 36 at printf.c:30, address = 0x00007f961e2a2864
(lldb) breakpoint set -n printf
Breakpoint 3: where = libc.so.6`__printf + 36 at printf.c:30, address = 0x00007f961e2a2864

(lldb) target modules lookup -s printf -v
1 symbols match 'printf' in /home/mikesart/data/src/blah2/build/blah:
        Address: 0x0000000000000000 (0x0000000000000000)
        Summary: 0x0000000000000000
0x0000000000000000
2 symbols match 'printf' in /lib/x86_64-linux-gnu/libc.so.6:
        Address: libc.so.6[0x0000000000053840] (libc.so.6..text + 215200)
        Summary: libc.so.6`__printf at printf.c:30
         Module: file = "/lib/x86_64-linux-gnu/libc.so.6", arch = "x86_64"
    CompileUnit: id = {0x0009273a}, file = "/build/buildd/eglibc-2.15/stdio-common/printf.c", language = "ISO C:1989"
       Function: id = {0x0009367e}, name = "__printf", range = [0x00007f961e2a2840-0x00007f961e2a28e1)
       FuncType: id = {0x0009367e}, decl = printf.c:29, clang_type = "int (const char *)"
         Blocks: id = {0x0009367e}, range = [0x7f961e2a2840-0x7f961e2a28e1)
      LineEntry: [0x00007f961e2a2840-0x00007f961e2a2864): /build/buildd/eglibc-2.15/stdio-common/printf.c:30
       Variable: id = {0x000936a3}, name = "format", type= "const char *", location = rdi, decl = printf.c:29
       Variable: id = {0x000936b3}, name = "arg", type= "va_list", location = DW_OP_fbreg(-216), decl = printf.c:31
       Variable: id = {0x000936c2}, name = "done", type= "int", location = rax, decl = printf.c:32
        Address: libc.so.6[0x0000000000053840] (libc-2.15.so..text + 215200)
        Summary: libc.so.6`__printf at printf.c:30
         Module: file = "/lib/x86_64-linux-gnu/libc.so.6", arch = "x86_64"
    CompileUnit: id = {0x0009273a}, file = "/build/buildd/eglibc-2.15/stdio-common/printf.c", language = "ISO C:1989"
       Function: id = {0x0009367e}, name = "__printf", range = [0x00007f961e2a2840-0x00007f961e2a28e1)
       FuncType: id = {0x0009367e}, decl = printf.c:29, clang_type = "int (const char *)"
         Blocks: id = {0x0009367e}, range = [0x7f961e2a2840-0x7f961e2a28e1)
      LineEntry: [0x00007f961e2a2840-0x00007f961e2a2864): /build/buildd/eglibc-2.15/stdio-common/printf.c:30
         Symbol: id = {0x00001ebc}, range = [0x0000000000053840-0x00000000000538e1), name="_IO_printf"
       Variable: id = {0x000936a3}, name = "format", type= "const char *", location = rdi, decl = printf.c:29
       Variable: id = {0x000936b3}, name = "arg", type= "va_list", location = DW_OP_fbreg(-216), decl = printf.c:31
       Variable: id = {0x000936c2}, name = "done", type= "int", location = rax, decl = printf.c:32

gdb works as expected:

(gdb) disassemble printf
Dump of assembler code for function __printf:
   0x00007ffff7054840 <+0>:     sub    rsp,0xd8
   0x00007ffff7054847:  test   al,al
   0x00007ffff7054849:  mov    QWORD PTR [rsp+0x28],rsi
   0x00007ffff705484e:  mov    QWORD PTR [rsp+0x30],rdx
   0x00007ffff7054853:  mov    QWORD PTR [rsp+0x38],rcx
   0x00007ffff7054858:  mov    QWORD PTR [rsp+0x40],r8
   0x00007ffff705485d:  mov    QWORD PTR [rsp+0x48],r9
   0x00007ffff7054862:  je     0x7ffff705489b
   0x00007ffff7054864:  movaps XMMWORD PTR [rsp+0x50],xmm0
   0x00007ffff7054869:  movaps XMMWORD PTR [rsp+0x60],xmm1
   0x00007ffff705486e:  movaps XMMWORD PTR [rsp+0x70],xmm2
   0x00007ffff7054873:  movaps XMMWORD PTR [rsp+0x80],xmm3
   0x00007ffff705487b:  movaps XMMWORD PTR [rsp+0x90],xmm4
   0x00007ffff7054883:  movaps XMMWORD PTR [rsp+0xa0],xmm5
   0x00007ffff705488b:  movaps XMMWORD PTR [rsp+0xb0],xmm6
   0x00007ffff7054893:  movaps XMMWORD PTR [rsp+0xc0],xmm7
   0x00007ffff705489b:  lea    rax,[rsp+0xe0]
   0x00007ffff70548a3:  mov    rsi,rdi
   0x00007ffff70548a6:  lea    rdx,[rsp+0x8]
   0x00007ffff70548ab:  mov    DWORD PTR [rsp+0x8],0x8
   0x00007ffff70548b3:  mov    DWORD PTR [rsp+0xc],0x30
   0x00007ffff70548bb:  mov    QWORD PTR [rsp+0x10],rax
   0x00007ffff70548c0:  lea    rax,[rsp+0x20]
   0x00007ffff70548c5:  mov    QWORD PTR [rsp+0x18],rax
   0x00007ffff70548ca:  mov    rax,QWORD PTR [rip+0x364647]        # 0x7ffff73b8f18
   0x00007ffff70548d1:  mov    rdi,QWORD PTR [rax]
   0x00007ffff70548d4:  call   0x7ffff70499c0 <_IO_vfprintf_internal at vfprintf.c:211>
   0x00007ffff70548d9:  add    rsp,0xd8
   0x00007ffff70548e0:  ret
End of assembler dump.
(gdb) b printf
Breakpoint 2 at 0x7ffff7054840: file printf.c, line 30.

_______________________________________________
lldb-dev mailing list
lldb-dev at cs.uiuc.edu<mailto:lldb-dev at cs.uiuc.edu>
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev





More information about the lldb-dev mailing list