From a80c6c7d36d25999a28cfad32e1f461db95ba4dc Mon Sep 17 00:00:00 2001 From: Walter Erquinigo Date: Mon, 21 Mar 2022 13:26:57 -0700 Subject: [PATCH] [trace] clear any existing tracing sessions before relaunching the binary There's a bug caused when a process is relaunched: the target, which doesn't change, keeps the Trace object from the previous process, which is already defunct, and causes segmentation faults when it's attempted to be used. A fix is to clean up the Trace object when the target is disposing of the previous process during relaunches. A way to reproduce this: ``` lldb a.out b main r process trace start c r process trace start ``` Differential Revision: https://reviews.llvm.org/D122176 --- lldb/source/Target/Target.cpp | 2 ++ lldb/test/API/commands/trace/TestTraceStartStop.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 00e9fd1..7199108 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -185,6 +185,8 @@ void Target::CleanupProcess() { void Target::DeleteCurrentProcess() { if (m_process_sp) { + // We dispose any active tracing sessions on the current process + m_trace_sp.reset(); m_section_load_history.Clear(); if (m_process_sp->IsAlive()) m_process_sp->Destroy(false); diff --git a/lldb/test/API/commands/trace/TestTraceStartStop.py b/lldb/test/API/commands/trace/TestTraceStartStop.py index 841ca43..d0d65fd 100644 --- a/lldb/test/API/commands/trace/TestTraceStartStop.py +++ b/lldb/test/API/commands/trace/TestTraceStartStop.py @@ -166,3 +166,16 @@ class TestTraceStartStop(TraceIntelPTTestCaseBase): self.expect("thread trace stop", error=True, substrs=["error: Process must be launched"]) + + # We should be able to trace the program if we relaunch it + # For this, we'll trace starting at a different point in the new + # process. + self.expect("breakpoint disable") + self.expect("b main.cpp:4") + self.expect("r") + self.expect("thread trace start") + # We can reconstruct the single instruction executed in the first line + self.expect("si") + self.expect("thread trace dump instructions -c 1", + patterns=[f'''thread #1: tid = .* + a.out`main \+ 11 at main.cpp:4''']) -- 2.7.4