[lldb-dev] Problem unwinding from inside of a CRT function

Zachary Turner zturner at google.com
Thu Jan 15 15:56:53 PST 2015

Having some trouble unwinding when I'm broken inside of a CRT function.
Another caveat is that I don't have symbols for this CRT function.  So the
problem could be anything from something I've done wrong on my side, to an
issue when symbols aren't present, to something else.  Here is the source
code of this program:

#include <stdio.h>

int main (void)
  printf("This is line 1\n");
  printf("This is line 2\n");
  printf("This is line 3\n");
  return 1;

Here is the disassembly of main:

(lldb) disassemble -n main -F intel
   0x1235040 <main>: push   ebp
   0x1235041 <main+1>: mov    ebp, esp
   0x1235043 <main+3>: sub    esp, 0x14
   0x1235046 <main+6>: lea    eax, [0x1230040]
   0x123504c <main+12>: mov    dword ptr [ebp - 0x4], 0x0
   0x1235053 <main+19>: mov    dword ptr [esp], eax
   0x1235056 <main+22>: call   0x12350a1
   0x123505b <main+27>: lea    ecx, [0x1230050]
   (snipped for brevity)

(Using the argument to "call" as the breakpoint address)
(lldb) break set -a 0x12350a1
Breakpoint 3: address = 0x012350a1
(lldb) run
Process 17044 launching
(lldb) Process 17044 launched: 'd:\testexe\expr_test.exe' (i386)
(lldb) Process 17044 stopped
* thread #1: tid = 0x40ec, 0x012350a1 expr_test.exe, stop reason =
breakpoint 3.1
    frame #0: 0x012350a1 expr_test.exe
-> 0x12350a1: pushl  $0xc
   0x12350a3: pushl  $0x1241000
   0x12350a8: calll  0x1235be0
   0x12350ad: xorl   %edi, %edi
(lldb) disassemble -b -F intel
-> 0x12350a1: 6a 0c           push   0xc
   0x12350a3: 68 00 10 24 01  push   0x1241000
   0x12350a8: e8 33 0b 00 00  call   0x1235be0
   0x12350ad: 33 ff           xor    edi, edi
   0x12350af: 89 7d e4        mov    dword ptr [ebp - 0x1c], edi
   0x12350b2: 33 c0           xor    eax, eax
   0x12350b4: 39 45 08        cmp    dword ptr [ebp + 0x8], eax
   0x12350b7: 0f 95 c0        setne  al
   0x12350ba: 85 c0           test   eax, eax
   0x12350bc: 75 15           jne    0x12350d3

Here's my register values:
(lldb) register read
General Purpose Registers:
       eax = 0x01230040
       ebx = 0x00000000
       ecx = 0x00000001
       edx = 0x00000000
       edi = 0x00000000
       esi = 0x00000000
       ebp = 0x00EAF920
       esp = 0x00EAF908
       eip = 0x012350A1
    eflags = 0b00000000000000000000001000010110

And using the value of esp to dump the stack (sorry, I don't know how to
use the -f argument to format this more nicely),

(lldb) memory read 0x00EAF908
0x00eaf908: 5b 50 23 01 40 00 23 01 00 00 00 00 00 00 00 00
 [P#. at .#.........
0x00eaf918: 28 f9 ea 00 00 00 00 00 68 f9 ea 00 4e 52 23 01

So the return address is 0x0123505b.  Cross-referencing this with the
original disassembly of main(), it looks like this is the correct value.

So it seems like the Unwinder has all the information it needs, but yet I'm
still only getting 1 frame.  Any suggestions how to dig into this?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20150115/82b52710/attachment.html>

More information about the lldb-dev mailing list