[Lldb-commits] [lldb] 51effa5 - Fix exception description in lldb-vscode

Jeffrey Tan via lldb-commits lldb-commits at lists.llvm.org
Tue Oct 25 13:24:34 PDT 2022


Author: Jeffrey Tan
Date: 2022-10-25T13:24:22-07:00
New Revision: 51effa57818bf937fb7c889b8f567c146bb4eefe

URL: https://github.com/llvm/llvm-project/commit/51effa57818bf937fb7c889b8f567c146bb4eefe
DIFF: https://github.com/llvm/llvm-project/commit/51effa57818bf937fb7c889b8f567c146bb4eefe.diff

LOG: Fix exception description in lldb-vscode

There is a bug in lldb-vscode that only shows stop reason ("exception") in
stopped event without showing the stop description of thrown exception. This
causes VSCode UI to only show "Paused on Exception" general message in
callstack window UI.

This patch fixes the bug so that VSCode callstack will show the detailed
exceptioni description, like "signal SIGABRT" or "EXC_BAD_ACCESS..." which
aligns with command line lldb experience.

I use C++ exception in testcase because the hardware exception description is
platform dependent and hard to verify.

Differential Revision: https://reviews.llvm.org/D136295

Added: 
    lldb/test/API/tools/lldb-vscode/exception/Makefile
    lldb/test/API/tools/lldb-vscode/exception/TestVSCode_exception.py
    lldb/test/API/tools/lldb-vscode/exception/main.cpp

Modified: 
    lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
    lldb/tools/lldb-vscode/JSONUtils.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py b/lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
index 8ba8e0e4bf3b4..a91f3b2b8feff 100644
--- a/lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
+++ b/lldb/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
@@ -93,10 +93,10 @@ def verify_breakpoint_hit(self, breakpoint_ids):
                         return
         self.assertTrue(False, "breakpoint not hit")
 
-    def verify_exception_breakpoint_hit(self, filter_label):
+    def verify_stop_exception_info(self, expected_description):
         '''Wait for the process we are debugging to stop, and verify the stop
            reason is 'exception' and that the description matches
-           'filter_label'
+           'expected_description'
         '''
         stopped_events = self.vscode.wait_for_stopped()
         for stopped_event in stopped_events:
@@ -109,7 +109,7 @@ def verify_exception_breakpoint_hit(self, filter_label):
                 if 'description' not in body:
                     continue
                 description = body['description']
-                if filter_label == description:
+                if expected_description == description:
                     return True
         return False
 
@@ -236,7 +236,7 @@ def continue_to_breakpoints(self, breakpoint_ids):
 
     def continue_to_exception_breakpoint(self, filter_label):
         self.vscode.request_continue()
-        self.assertTrue(self.verify_exception_breakpoint_hit(filter_label),
+        self.assertTrue(self.verify_stop_exception_info(filter_label),
                         'verify we got "%s"' % (filter_label))
 
     def continue_to_exit(self, exitCode=0):

diff  --git a/lldb/test/API/tools/lldb-vscode/exception/Makefile b/lldb/test/API/tools/lldb-vscode/exception/Makefile
new file mode 100644
index 0000000000000..99998b20bcb05
--- /dev/null
+++ b/lldb/test/API/tools/lldb-vscode/exception/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules

diff  --git a/lldb/test/API/tools/lldb-vscode/exception/TestVSCode_exception.py b/lldb/test/API/tools/lldb-vscode/exception/TestVSCode_exception.py
new file mode 100644
index 0000000000000..2fc0d9c638c3a
--- /dev/null
+++ b/lldb/test/API/tools/lldb-vscode/exception/TestVSCode_exception.py
@@ -0,0 +1,24 @@
+"""
+Test exception behavior in VSCode
+"""
+
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+import lldbvscode_testcase
+
+
+class TestVSCode_exception(lldbvscode_testcase.VSCodeTestCaseBase):
+
+    @skipIfWindows
+    def test_stopped_description(self):
+        '''
+            Test that exception description is shown correctly in stopped
+            event.
+        '''
+        program = self.getBuildArtifact("a.out")
+        print("test_stopped_description called", flush=True)
+        self.build_and_launch(program)
+
+        self.vscode.request_continue()
+        self.assertTrue(self.verify_stop_exception_info("signal SIGABRT"))

diff  --git a/lldb/test/API/tools/lldb-vscode/exception/main.cpp b/lldb/test/API/tools/lldb-vscode/exception/main.cpp
new file mode 100644
index 0000000000000..b940d07c6f2bb
--- /dev/null
+++ b/lldb/test/API/tools/lldb-vscode/exception/main.cpp
@@ -0,0 +1,6 @@
+#include <signal.h>
+
+int main() {
+  raise(SIGABRT);
+  return 0;
+}

diff  --git a/lldb/tools/lldb-vscode/JSONUtils.cpp b/lldb/tools/lldb-vscode/JSONUtils.cpp
index 4bc965e61b81e..baeed2a81105c 100644
--- a/lldb/tools/lldb-vscode/JSONUtils.cpp
+++ b/lldb/tools/lldb-vscode/JSONUtils.cpp
@@ -930,7 +930,7 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread,
   // If no description has been set, then set it to the default thread stopped
   // description. If we have breakpoints that get hit and shouldn't be reported
   // as breakpoints, then they will set the description above.
-  if (ObjectContainsKey(body, "description")) {
+  if (!ObjectContainsKey(body, "description")) {
     char description[1024];
     if (thread.GetStopDescription(description, sizeof(description))) {
       EmplaceSafeString(body, "description", std::string(description));


        


More information about the lldb-commits mailing list