[lldb-dev] POP instruction causes process continuation
Greg Clayton
gclayton at apple.com
Thu Mar 26 11:29:55 PDT 2015
Try getting a backtrace at each location. Stepping is very sensitive to stacks being able to correctly unwind themselves. If the stack is wrong, it might change the behavior of the step. So repeat with "bt" between each one.
> On Mar 26, 2015, at 11:14 AM, Christian Mayer <christian at fox21.at> wrote:
>
> Hi,
>
> I have the following i386 assembly code:
>
>
> ##########
> .text
> .globl _main
>
> _main:
>
> nop
>
> push %ebp
> mov %esp, %ebp
>
> sub $0x4, %esp
> push $msg1
> call _puts
> add $0x8, %esp
>
> pop %ebp
> push %ebp
>
> sub $0x4, %esp
> push $msg2
> call _puts
> add $0x8, %esp
>
> mov $5, %eax
> pop %ebp
> ret
>
> .data
> msg1:
> .ascii "Hello World!\0"
> len = . - msg1
>
> msg2:
> .ascii "This is a second line.\0"
> len = . - msg2
> ##########
>
>
>
> Compiled under Mac OS X 10.10 with the following commands:
>
> as -W -arch i386 -o build/test3-i386.o test3-i386.s
> ld -arch i386 -macosx_version_min 10.10 -no_pie -o build/test3-i386
> build/test3-i386.o -lSystem
>
>
> When I run the compiled binary in the shell everything works fine,
> but when I debug it from _main step-by-step with "thread step-inst-over"
> in LLDB 340.99.0 (ToT) - LLDB automatically continues on the first "pop
> %ebp" instruction.
>
>
> :> lldb build/test3-i386
> lldb:> target create "build/test3-i386"
> Current executable set to 'build/test3-i386' (i386).
> lldb:> br s -n main
> Breakpoint 1: where = test3-i386`main, address = 0x00001f6d
> lldb:> process launch
> Process 66822 launched: 'build/test3-i386' (i386)
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f6d test3-i386`main, queue =
> 'com.apple.main-thread', stop reason = breakpoint 1.1
> frame #0: 0x00001f6d test3-i386`main
> -> 0x1f6d <test3-i386`main+0>: nop
> 0x1f6e <test3-i386`main+1>: pushl %ebp
> 0x1f6f <test3-i386`main+2>: movl %esp, %ebp
> 0x1f71 <test3-i386`main+4>: subl $0x4, %esp
> lldb:> ni
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f6e test3-i386`main + 1, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f6e test3-i386`main + 1
> -> 0x1f6e <test3-i386`main+1>: pushl %ebp
> 0x1f6f <test3-i386`main+2>: movl %esp, %ebp
> 0x1f71 <test3-i386`main+4>: subl $0x4, %esp
> 0x1f74 <test3-i386`main+7>: pushl $0x200c
> lldb:>
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f6f test3-i386`main + 2, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f6f test3-i386`main + 2
> -> 0x1f6f <test3-i386`main+2>: movl %esp, %ebp
> 0x1f71 <test3-i386`main+4>: subl $0x4, %esp
> 0x1f74 <test3-i386`main+7>: pushl $0x200c
> 0x1f79 <test3-i386`main+12>: calll 0x1f9a ; symbol stub for: puts
> lldb:>
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f71 test3-i386`main + 4, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f71 test3-i386`main + 4
> -> 0x1f71 <test3-i386`main+4>: subl $0x4, %esp
> 0x1f74 <test3-i386`main+7>: pushl $0x200c
> 0x1f79 <test3-i386`main+12>: calll 0x1f9a ; symbol stub for: puts
> 0x1f7e <test3-i386`main+17>: addl $0x8, %esp
> lldb:>
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f74 test3-i386`main + 7, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f74 test3-i386`main + 7
> -> 0x1f74 <test3-i386`main+7>: pushl $0x200c
> 0x1f79 <test3-i386`main+12>: calll 0x1f9a ; symbol stub for: puts
> 0x1f7e <test3-i386`main+17>: addl $0x8, %esp
> 0x1f81 <test3-i386`main+20>: popl %ebp
> lldb:>
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f79 test3-i386`main + 12, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f79 test3-i386`main + 12
> -> 0x1f79 <test3-i386`main+12>: calll 0x1f9a ; symbol stub for: puts
> 0x1f7e <test3-i386`main+17>: addl $0x8, %esp
> 0x1f81 <test3-i386`main+20>: popl %ebp
> 0x1f82 <test3-i386`main+21>: pushl %ebp
> lldb:>
> Hello World!
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f7e test3-i386`main + 17, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f7e test3-i386`main + 17
> -> 0x1f7e <test3-i386`main+17>: addl $0x8, %esp
> 0x1f81 <test3-i386`main+20>: popl %ebp
> 0x1f82 <test3-i386`main+21>: pushl %ebp
> 0x1f83 <test3-i386`main+22>: subl $0x4, %esp
> lldb:>
> Process 66822 stopped
> * thread #1: tid = 0x2af723, 0x00001f81 test3-i386`main + 20, queue =
> 'com.apple.main-thread', stop reason = instruction step over
> frame #0: 0x00001f81 test3-i386`main + 20
> -> 0x1f81 <test3-i386`main+20>: popl %ebp
> 0x1f82 <test3-i386`main+21>: pushl %ebp
> 0x1f83 <test3-i386`main+22>: subl $0x4, %esp
> 0x1f86 <test3-i386`main+25>: pushl $0x2019
> lldb:>
> This is a second line.
> Process 66822 exited with status = 5 (0x00000005)
> lldb:> ^D
>
> When I remove
>
> pop %ebp
> push %ebp
>
> it works fine. Then LLDB stops after each single instruction step over
> until to the end of the program.
>
>
> When I also remove the instructions for the output of the second puts()
> it continues at the bottom "pop %ebp", before "ret":
>
> ##########
> .text
> .globl _main
>
> _main:
>
> nop
>
> push %ebp
> mov %esp, %ebp
>
> sub $0x4, %esp
> push $msg1
> call _puts
> add $0x8, %esp
>
> mov $5, %eax
> pop %ebp
> ret
>
> .data
> msg1:
> .ascii "Hello World!\0"
> len = . - msg1
>
> msg2:
> .ascii "This is a second line.\0"
> len = . - msg2
> ##########
>
> It should do only one instruction step over.
>
> What am I doing wrong?
>
>
> Br,
> Christian
>
> --
> Christian Mayer
> software developer
> http://fox21.at
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
More information about the lldb-dev
mailing list