<div dir="ltr">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.  <div><br></div><div><div>(lldb) Process 9140 stopped</div><div>* thread #1: tid = 0x2ef8, <b>0x00415086</b> expr_test.exe`main + 70 at expr_test.cpp:29, stop reason = breakpoint 1.1</div><div>    frame #0: <b>0x00415086</b> expr_test.exe`main + 70 at expr_test.cpp:29</div></div><div><br></div><div>The address given here is 0x415086.  And indeed, if I disassemble this address, I see actual code.</div><div><br></div><div><div>invalid command 'frame #0:'</div><div>(lldb) dis -n main -F intel</div><div>...</div><div>-> <b>0x415086</b> <main+70>: mov    dword ptr [esp], ecx<br></div><div>   0x415089 <main+73>: mov    dword ptr [ebp - 0xc], eax</div><div>   0x41508c <main+76>: call   0x4150d7</div></div><div><br></div><div><div>(lldb) dis -s 0x415086 -F intel</div><div>-> <b>0x415086</b> <main+70>: mov    dword ptr [esp], ecx</div><div>   0x415089 <main+73>: mov    dword ptr [ebp - 0xc], eax</div><div>   0x41508c <main+76>: call   0x4150d7</div><div>   0x415091 <main+81>: lea    ecx, [0x41006e]</div><div>   0x415097 <main+87>: mov    dword ptr [esp], ecx</div><div>   0x41509a <main+90>: mov    dword ptr [ebp - 0x10], eax</div><div>   0x41509d <main+93>: call   0x4150d7</div></div><div><br></div><div>But when I try to set a breakpoint at that address, bad stuff happens:</div><div><div>(lldb) break set -a <b>0x415086</b></div><div>warning: failed to set breakpoint site at 0x415086 for breakpoint 2.1: Unable to read memory at breakpoint address.</div><div>Breakpoint 2: where = expr_test.exe`main + 70 at expr_test.cpp:29, address = <b>0x00415086</b></div></div><div><b><br></b></div><div>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:</div><div><br></div><div><div>  printf("main = 0x%p\n", main);</div><div>  printf("_ImageBase = 0x%p", &__ImageBase);</div></div><div><br></div><div>And this prints out the following:</div><div>main = 0x00AE5040</div><div>_ImageBase = 0x00AD0000<br></div><div><br></div><div>Note that the address of main printed by my program is quite far off from the address reported by LLDB.  </div><div><br></div><div>If I run llvm-readobj on my COFF file, I see this:</div><div><br></div><div><div>  BaseOfCode: 0x15000</div><div>  ImageBase: 0x400000<br></div></div><div><br></div><div>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.</div><div><br></div><div>So, in short: <b>It's not taking into account the load address of the executable module.</b></div><div><b><br></b></div><div>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.</div><div><br></div><div>But in the end, some part of LLDB still isn't happy.</div><div><br></div><div>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.</div><div><br></div><div>I must be missing a step somewhere, but I'm not quite sure what.</div></div>