diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py index e8a1b81a83941..839a47041ae8c 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py @@ -24,6 +24,14 @@ def test_cpp_exception_breakpoint(self): self.build() self.do_cpp_exception_bkpt() + @add_test_categories(['pyapi']) + @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24538") + @expectedFailureNetBSD + def test_dummy_target_cpp_exception_breakpoint(self): + """Test setting and hitting the C++ exception breakpoint from dummy target.""" + self.build() + self.do_dummy_target_cpp_exception_bkpt() + def setUp(self): TestBase.setUp(self) self.main_source = "main.c" @@ -50,3 +58,30 @@ def do_cpp_exception_bkpt(self): process, exception_bkpt) self.assertTrue(len(thread_list) == 1, "One thread stopped at the exception breakpoint.") + + def do_dummy_target_cpp_exception_bkpt(self): + exe = self.getBuildArtifact("a.out") + error = lldb.SBError() + + dummy_exception_bkpt = self.dbg.GetDummyTarget().BreakpointCreateForException( + lldb.eLanguageTypeC_plus_plus, False, True) + self.assertTrue( + dummy_exception_bkpt.IsValid(), + "Created exception breakpoint in dummy target.") + + self.target = self.dbg.CreateTarget(exe) + self.assertTrue(self.target, VALID_TARGET) + + exception_bkpt = self.target.GetBreakpointAtIndex(0) + self.assertTrue( + exception_bkpt.IsValid(), + "Target primed with exception breakpoint from dummy target.") + + process = self.target.LaunchSimple( + None, None, self.get_process_working_directory()) + self.assertTrue(process, PROCESS_IS_VALID) + + thread_list = lldbutil.get_threads_stopped_at_breakpoint( + process, exception_bkpt) + self.assertTrue(len(thread_list) == 1, + "One thread stopped at the exception breakpoint.") diff --git a/lldb/source/Target/LanguageRuntime.cpp b/lldb/source/Target/LanguageRuntime.cpp index 999ac99e93c35..32dd805a00b1d 100644 --- a/lldb/source/Target/LanguageRuntime.cpp +++ b/lldb/source/Target/LanguageRuntime.cpp @@ -155,8 +155,10 @@ class ExceptionBreakpointResolver : public BreakpointResolver { protected: BreakpointResolverSP CopyForBreakpoint(Breakpoint &breakpoint) override { - return BreakpointResolverSP( + BreakpointResolverSP ret_sp( new ExceptionBreakpointResolver(m_language, m_catch_bp, m_throw_bp)); + ret_sp->SetBreakpoint(&breakpoint); + return ret_sp; } bool SetActualResolver() {