Skip to content

Commit

Permalink
[lldb] Migrate condition evaluation failure to ReportError
Browse files Browse the repository at this point in the history
Migrate to using ReportError to report a failure to evaluate a
watchpoint condition. I had already done so for the parallel code for
breakpoints.

In the process, I noticed that I accidentally regressed the error
reporting for breakpoint conditions by dropping the call to
GetDescription. This patch rectifies that and adds a test.

Because the call to GetDescription expects a Stream*, I also switches
from using a raw_string_ostream to a StreamString for both breakpoints
and watchpoints.
  • Loading branch information
JDevlieghere committed Mar 17, 2022
1 parent 77eee57 commit d10c0c7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 21 deletions.
39 changes: 18 additions & 21 deletions lldb/source/Target/StopInfo.cpp
Expand Up @@ -452,19 +452,18 @@ class StopInfoBreakpoint : public StopInfo {

if (!condition_error.Success()) {
const char *err_str =
condition_error.AsCString("<Unknown Error>");
condition_error.AsCString("<unknown error>");
LLDB_LOGF(log, "Error evaluating condition: \"%s\"\n", err_str);

std::string error_message;
llvm::raw_string_ostream os(error_message);
os << "stopped due to an error evaluating condition of "
"breakpoint "
<< bp_loc_sp->GetConditionText() << '\n';
os << err_str;
os.flush();
StreamString strm;
strm << "stopped due to an error evaluating condition of "
"breakpoint ";
bp_loc_sp->GetDescription(&strm, eDescriptionLevelBrief);
strm << ": \"" << bp_loc_sp->GetConditionText() << "\"\n";
strm << err_str;

Debugger::ReportError(
std::move(error_message),
strm.GetString().str(),
exe_ctx.GetTargetRef().GetDebugger().GetID());
} else {
LLDB_LOGF(log,
Expand Down Expand Up @@ -860,20 +859,18 @@ class StopInfoWatchpoint : public StopInfo {
}
}
} else {
StreamSP error_sp = debugger.GetAsyncErrorStream();
error_sp->Printf(
"Stopped due to an error evaluating condition of watchpoint ");
wp_sp->GetDescription(error_sp.get(), eDescriptionLevelBrief);
error_sp->Printf(": \"%s\"", wp_sp->GetConditionText());
error_sp->EOL();
const char *err_str = error.AsCString("<Unknown Error>");
const char *err_str = error.AsCString("<unknown error>");
LLDB_LOGF(log, "Error evaluating condition: \"%s\"\n", err_str);

error_sp->PutCString(err_str);
error_sp->EOL();
error_sp->Flush();
// If the condition fails to be parsed or run, we should stop.
m_should_stop = true;
StreamString strm;
strm << "stopped due to an error evaluating condition of "
"watchpoint ";
wp_sp->GetDescription(&strm, eDescriptionLevelBrief);
strm << ": \"" << wp_sp->GetConditionText() << "\"\n";
strm << err_str;

Debugger::ReportError(strm.GetString().str(),
exe_ctx.GetTargetRef().GetDebugger().GetID());
}
}

Expand Down
5 changes: 5 additions & 0 deletions lldb/test/Shell/Breakpoint/invalid-condition.test
@@ -0,0 +1,5 @@
# RUN: %clang_host %p/Inputs/dummy-target.c -o %t.out
# RUN: %lldb -b -o "br s -n main -c 'bogus'" -o "run" %t.out 2>&1 | FileCheck %s

# CHECK: error: stopped due to an error evaluating condition of breakpoint 1.1: "bogus"
# CHECK-NEXT: Couldn't parse conditional expression

0 comments on commit d10c0c7

Please sign in to comment.