[lldb] Migrate condition evaluation failure to ReportError
authorJonas Devlieghere <jonas@devlieghere.com>
Thu, 17 Mar 2022 05:38:39 +0000 (22:38 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Thu, 17 Mar 2022 05:54:02 +0000 (22:54 -0700)
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.

lldb/source/Target/StopInfo.cpp
lldb/test/Shell/Breakpoint/invalid-condition.test [new file with mode: 0644]

index f6cf3e55ce233f60e424e4ea6614b3208811dc2a..08c50ea5e62c9e6ecd0f1b476a323f63e6032b5a 100644 (file)
@@ -452,19 +452,18 @@ protected:
 
               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,
@@ -860,20 +859,18 @@ protected:
               }
             }
           } 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());
           }
         }
 
diff --git a/lldb/test/Shell/Breakpoint/invalid-condition.test b/lldb/test/Shell/Breakpoint/invalid-condition.test
new file mode 100644 (file)
index 0000000..5990600
--- /dev/null
@@ -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