[Lldb-commits] [PATCH] D129078: [LLDB][ClangExpression] Allow expression evaluation from within C++ Lambdas

Michael Buch via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Jul 14 09:08:54 PDT 2022


Michael137 added a comment.

After playing around with this some more I found an edge case with conditional breakpoints (in fact any place where we reuse an LLVMUserExpression). Modifying `lldb/test/API/functionalities/breakpoint/two_hits_one_actual` such that the helper method is inside a lambda like so:

  struct Foo {
    void usleep_helper(int usec) {
      [this, &usec] {
          // Break here in the helper
          std::this_thread::sleep_for(std::chrono::duration<unsigned int, std::milli>(usec));
      }();
    }
  };
  
  void *background_thread(void *arg) {
      (void) arg;
      Foo f;
      for (;;) {
          f.usleep_helper(2);
      }
  }
  
  int main(void) {
    std::thread main_thread(background_thread, nullptr);
    Foo f;
    for (;;) {
      f.usleep_helper(1);
    }
  }

Then setting a breakpoint twice, one for `usec == 1` and `usec == 100`, we would end up hitting the breakpoint even if `usec == 2` because conditional breakpoints re-use Materializer (and thus Entity objects). Since `EntityValueObject::GetValueObject` simply returns the ValueObject it was instantiated with, the `usec == 1` condition always evaluates to `true`. Have a fix for this but verifying whether that really is the best approach.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D129078



More information about the lldb-commits mailing list