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.