forked from OSchip/llvm-project
[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:
parent
31e44c01e3
commit
a80c6c7d36
|
@ -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);
|
||||
|
|
|
@ -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'''])
|
||||
|
|
Loading…
Reference in New Issue