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
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits