[lldb-dev] resolved load addresses vs. unresolved offset addresses

Zachary Turner zturner at google.com
Wed Jan 21 17:09:42 PST 2015

So I think my problem with stack unwinding and thread step-over (or my
immediate problem anyway) is somewhat unrelated to the long discussion we
had earlier, and is much simpler.

(lldb) Process 9140 stopped
* thread #1: tid = 0x2ef8, *0x00415086* expr_test.exe`main + 70 at
expr_test.cpp:29, stop reason = breakpoint 1.1
    frame #0: *0x00415086* expr_test.exe`main + 70 at expr_test.cpp:29

The address given here is 0x415086.  And indeed, if I disassemble this
address, I see actual code.

invalid command 'frame #0:'
(lldb) dis -n main -F intel
-> *0x415086* <main+70>: mov    dword ptr [esp], ecx
   0x415089 <main+73>: mov    dword ptr [ebp - 0xc], eax
   0x41508c <main+76>: call   0x4150d7

(lldb) dis -s 0x415086 -F intel
-> *0x415086* <main+70>: mov    dword ptr [esp], ecx
   0x415089 <main+73>: mov    dword ptr [ebp - 0xc], eax
   0x41508c <main+76>: call   0x4150d7
   0x415091 <main+81>: lea    ecx, [0x41006e]
   0x415097 <main+87>: mov    dword ptr [esp], ecx
   0x41509a <main+90>: mov    dword ptr [ebp - 0x10], eax
   0x41509d <main+93>: call   0x4150d7

But when I try to set a breakpoint at that address, bad stuff happens:
(lldb) break set -a *0x415086*
warning: failed to set breakpoint site at 0x415086 for breakpoint 2.1:
Unable to read memory at breakpoint address.
Breakpoint 2: where = expr_test.exe`main + 70 at expr_test.cpp:29, address
= *0x00415086*

I modified the source of my program to print out the image base and the
address of main at startup by adding these two lines:

  printf("main = 0x%p\n", main);
  printf("_ImageBase = 0x%p", &__ImageBase);

And this prints out the following:
main = 0x00AE5040
_ImageBase = 0x00AD0000

Note that the address of main printed by my program is quite far off from
the address reported by LLDB.

If I run llvm-readobj on my COFF file, I see this:

  BaseOfCode: 0x15000
  ImageBase: 0x400000

Adding these two together, I get 0x415000, which is only 0x86 bytes away
from what LLDB Is reporting as the instruction I'm broken at.

So, in short: *It's not taking into account the load address of the
executable module.*

I checked my process plugin, and when the debugger connects to the process,
it does get the load address which is 0x00AD0000 and it create a ModuleSP
for it, it calls SetLoadAddress, and then it calls ModulesDidLoad.

But in the end, some part of LLDB still isn't happy.

How this all relates to thread step-over is that LLDB is trying to set an
address breakpoint on a 0x415xxx address, which is only a RVA that needs to
be added to the load address.

I must be missing a step somewhere, but I'm not quite sure what.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20150122/ba9f4a7d/attachment.html>

More information about the lldb-dev mailing list