[Lldb-commits] [lldb] [lldb-dap] Fix logpoint to breakpoint conversion (PR #222906)

Ebuka Ezike via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 11 07:47:29 PDT 2026


================
@@ -78,6 +78,69 @@ def test_logMessage_basic(self):
             )
         session.continue_to_exit()
 
+    def check_logpoint_to_breakpoint_conversion(self, log_message):
+        session = self.build_and_create_session()
+        initial_stop = self.stop_at_before_loop_line(session)
+        loop_line = line_number("main.cpp", "// break loop")
+        after_loop_line = line_number("main.cpp", "// after loop")
+        log_prefix = "This is log message for "
+
+        [logpoint_id, post_loop_breakpoint_id] = session.resolve_source_breakpoints(
+            self.main_path,
+            [
+                SourceBreakpoint(loop_line, logMessage=log_prefix + "{i}"),
+                SourceBreakpoint(after_loop_line),
+            ],
+        )
+
+        # Change logpoint to usual breakpoint and check that id preserved.
+        [breakpoint_id, _] = session.resolve_source_breakpoints(
+            self.main_path,
+            [
+                SourceBreakpoint(loop_line, logMessage=log_message),
+                SourceBreakpoint(after_loop_line),
+            ],
+        )
+        self.assertEqual(breakpoint_id, logpoint_id)
+
+        # Check that stop works as expected for updated logpoint.
+        loop_stop = session.continue_to_breakpoint(breakpoint_id)
+        frame = session.top_frame_from(loop_stop)
+        self.assertEqual(frame.locals["i"].value_as_int, 0)
+        captured = session.collect_console(after=initial_stop, until=loop_stop)
+        self.assertNotIn(log_prefix, captured.seen_texts)
+
+        # Change breakpoint to logpoint back.
+        [restored_id, _] = session.resolve_source_breakpoints(
+            self.main_path,
+            [
+                SourceBreakpoint(loop_line, logMessage=log_prefix + "{i}"),
+                SourceBreakpoint(after_loop_line),
+            ],
+        )
+        self.assertEqual(restored_id, logpoint_id)
+
+        # Check that logpoint prints messages.
+        post_loop_stop = session.continue_to_breakpoint(post_loop_breakpoint_id)
+        captured = session.collect_console(after=loop_stop, until=post_loop_stop)
+        messages = [
+            line
+            for line in captured.seen_texts.splitlines()
+            if line.startswith(log_prefix)
+        ]
+        self.assertEqual(messages, [log_prefix + str(i) for i in range(1, 10)])
+        session.continue_to_exit()
+
+    @skipIfWindows
+    def test_logmessage_none(self):
----------------
da-viper wrote:

>  so integration tests looks as a good choice here

Yes for the first part. Internally should be no difference between `logMessage = std::nullopt` and `logMessage = ""`. 
So instead of having two integration test for `logMessage = std::nullopt` and `logMessage = ""`.

we have: 
One integration test setting logPoint to None.  
```cpp
struct SourceBreakpoint {
    String logMessage;  // from `std::optional<String>` logMessage; 
}
```
and a Unit test checking the below json objects deserialises to the same `SourceBreakpoint` with an empty `logMessage`
```jsonl
{ "line": 0, "logMessage" : null }
{ "line": 0 }
{ "line": 0, "logMessage": "" }
```


https://github.com/llvm/llvm-project/pull/222906


More information about the lldb-commits mailing list