jingham added a comment.

In D71372#1781316 <https://reviews.llvm.org/D71372#1781316>, @labath wrote:

> I'm not sure how easy it is to do that here, but it would certainly be nice 
> to include these error messages in the actual error output from the "finish" 
> command so that they are visible even without logging enabled.


That's a good idea, and should be easy to do.

Since you can't really fail in constructors, the way the ThreadPlans work is 
that you make a thread plan, and if making it fails you leave a note to 
yourself that construction failed.  Then when you go to queue the thread plan, 
Thread::QueueThreadPlan calls ValidatePlan on the new plan, and if that returns 
false the plan is unshipped.  ValidatePlan takes a Stream argument as well, so 
the plans can write error messages.  That's how you see the "Could not create 
return address breakpoint" in this patch.  Finally, if QueueThreadPlan fails, 
CommandObjectThread::CommandObjectThreadStepWithTypeAndScope copies the Status 
message into the command result.

So just add a std::string to ThreadPlanStepOut, and cons up your error message 
there.  Then in ThreadPlanStepOut::ValidatePlan, instead of doing:

  if (m_return_bp_id == LLDB_INVALID_BREAK_ID) {
    if (error)
      error->PutCString("Could not create return address breakpoint.");
    return false;
  }

Write the error string you made in the constructor.

It's a good idea to log it as well, since the logs don't get command output so 
having it there will make logs easier to read.

> As for the test, you should be able to do something similar to the tests in 
> the `test/Shell/Unwind` folder (e.g. eh-frame-dwarf-unwind.test). I.e., you 
> could write an assembly function which uses a non-standard frame layout, but 
> do *not* describe that layout via .eh_frame. Then, stop in that function and 
> try to step out...
> 
> In D71372#1780508 <https://reviews.llvm.org/D71372#1780508>, @mossberg wrote:
> 
>> Something I noticed while updating the patch was that the 
>> `GetLoadedAddressPermissions` call would succeed, even if passed an address 
>> that is obviously not mapped. In my test case I placed an int 0x22 where the 
>> return address would be, expecting the validation to fail at the 
>> `GetLoadAddressPermissions` call because 0x22 is not mapped. However, it 
>> only ended up failing when the permissions (which were empty) were checked 
>> for an execute bit. It seems to me like this might be another bug, but I'm 
>> not sure.
> 
> 
> Are you sure there is nothing mapped at that address? I'm not a darwin 
> expert, but I have a vague knowledge that the darwin loader (or some other 
> component of the system) actually maps a couple of pages of unreadable memory 
> around the address zero...

Yes the whole first 32 bits of the address space get mapped with no access.  
That was done to catch any 32 ->64 bit address handling goofs when macOS was 
going from 32 to 64 bit architectures.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71372/new/

https://reviews.llvm.org/D71372



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to