[Lldb-commits] [PATCH] D100267: [lldb] [gdb-remote client] Remove breakpoints throughout vfork
Michał Górny via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Sep 1 01:34:05 PDT 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc56898584561: [lldb] [gdb-remote client] Remove breakpoints throughout vfork (authored by mgorny).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100267/new/
https://reviews.llvm.org/D100267
Files:
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
Index: lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
===================================================================
--- /dev/null
+++ lldb/test/Shell/Subprocess/vfork-follow-parent-softbp.test
@@ -0,0 +1,13 @@
+# REQUIRES: native
+# UNSUPPORTED: system-darwin
+# UNSUPPORTED: system-windows
+# RUN: %clangxx_host %p/Inputs/fork.cpp -DTEST_FORK=vfork -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+b parent_func
+b child_func
+process launch
+# CHECK-NOT: function run in parent
+# CHECK: stop reason = breakpoint
+continue
+# CHECK: function run in parent
+# CHECK: child exited: 0
Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -232,6 +232,7 @@
void DidFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override;
void DidVFork(lldb::pid_t child_pid, lldb::tid_t child_tid) override;
+ void DidVForkDone() override;
protected:
friend class ThreadGDBRemote;
@@ -296,6 +297,8 @@
using FlashRange = FlashRangeVector::Entry;
FlashRangeVector m_erased_flash_ranges;
+ bool m_vfork_in_progress;
+
// Accessors
bool IsRunning(lldb::StateType state) {
return state == lldb::eStateRunning || IsStepping(state);
Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -265,7 +265,8 @@
m_waiting_for_attach(false), m_destroy_tried_resuming(false),
m_command_sp(), m_breakpoint_pc_offset(0),
m_initial_tid(LLDB_INVALID_THREAD_ID), m_replay_mode(false),
- m_allow_flash_writes(false), m_erased_flash_ranges() {
+ m_allow_flash_writes(false), m_erased_flash_ranges(),
+ m_vfork_in_progress(false) {
m_async_broadcaster.SetEventName(eBroadcastBitAsyncThreadShouldExit,
"async thread should exit");
m_async_broadcaster.SetEventName(eBroadcastBitAsyncContinue,
@@ -5492,7 +5493,7 @@
bp_site->GetType() == BreakpointSite::eExternal)) {
m_gdb_comm.SendGDBStoppointTypePacket(
eBreakpointSoftware, enable, bp_site->GetLoadAddress(),
- bp_site->GetTrapOpcodeMaxByteSize(), GetInterruptTimeout());
+ GetSoftwareBreakpointTrapOpcode(bp_site), GetInterruptTimeout());
}
});
}
@@ -5534,6 +5535,13 @@
void ProcessGDBRemote::DidVFork(lldb::pid_t child_pid, lldb::tid_t child_tid) {
Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
+ assert(!m_vfork_in_progress);
+ m_vfork_in_progress = true;
+
+ // Disable all software breakpoints for the duration of vfork.
+ if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointSoftware))
+ DidForkSwitchSoftwareBreakpoints(false);
+
LLDB_LOG(log, "Detaching forked child {0}", child_pid);
Status error = m_gdb_comm.Detach(false, child_pid);
if (error.Fail()) {
@@ -5543,3 +5551,12 @@
return;
}
}
+
+void ProcessGDBRemote::DidVForkDone() {
+ assert(m_vfork_in_progress);
+ m_vfork_in_progress = false;
+
+ // Reenable all software breakpoints that were enabled before vfork.
+ if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointSoftware))
+ DidForkSwitchSoftwareBreakpoints(true);
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100267.369882.patch
Type: text/x-patch
Size: 3473 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20210901/65e9de2c/attachment-0001.bin>
More information about the lldb-commits
mailing list