[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
This commit is contained in:
Walter Erquinigo 2022-03-21 13:26:57 -07:00
parent 31e44c01e3
commit a80c6c7d36
2 changed files with 15 additions and 0 deletions

View File

@ -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);

View File

@ -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'''])