From 7f958700a09f09ac124b20d23236ede472b58d87 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 2 Apr 2020 11:19:28 +0200 Subject: Debugger: Make LLDB work a bit with remote Linux The device on remote side *has* to configure (/usr/bin/)lldb-server as "GDB server executable" in the device settings. A real gdbserver does not work. Change-Id: I045ffb60a824e06ee683d8bdfffeb480a580af5f Reviewed-by: Christian Kandeler --- share/qtcreator/debugger/lldbbridge.py | 56 ++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index b980605451..2995256b1a 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -879,7 +879,35 @@ class Dumper(DumperBase): self.debugger.SetCurrentPlatformSDKRoot(self.sysRoot_) exefile = None if self.attachPid_ > 0 else self.executable_ - self.target = self.debugger.CreateTarget(exefile, None, None, True, error) + + self.target = self.debugger.CreateTarget( + exefile, None, self.platform_, True, error) + + if not error.Success(): + self.report(self.describeError(error)) + self.reportState('enginerunfailed') + return + + if (self.startMode_ == DebuggerStartMode.AttachToRemoteServer + or self.startMode_ == DebuggerStartMode.AttachToRemoteProcess): + + + remote_channel = 'connect://' + self.remoteChannel_ + connect_options = lldb.SBPlatformConnectOptions(remote_channel) + + res = self.target.GetPlatform().ConnectRemote(connect_options) + DumperBase.warn("CONNECT: %s %s %s" % (res, + self.target.GetPlatform().GetName(), + self.target.GetPlatform().IsConnected())) + + + broadcaster = self.target.GetBroadcaster() + listener = self.debugger.GetListener() + broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged) + listener.StartListeningForEvents(broadcaster, lldb.SBProcess.eBroadcastBitStateChanged) + broadcaster.AddListener(listener, lldb.SBTarget.eBroadcastBitBreakpointChanged) + listener.StartListeningForEvents( + broadcaster, lldb.SBTarget.eBroadcastBitBreakpointChanged) if self.nativeMixed: self.interpreterEventBreakpoint = \ @@ -918,17 +946,29 @@ class Dumper(DumperBase): self.reportState('enginerunandinferiorrunok') elif (self.startMode_ == DebuggerStartMode.AttachToRemoteServer or self.startMode_ == DebuggerStartMode.AttachToRemoteProcess): - self.process = self.target.ConnectRemote( - self.debugger.GetListener(), - self.remoteChannel_, None, error) + + f = lldb.SBFileSpec() + f.SetFilename(self.executable_) + + launchInfo = lldb.SBLaunchInfo(self.processArgs_) + #launchInfo.SetWorkingDirectory(self.workingDirectory_) + launchInfo.SetWorkingDirectory('/tmp') + launchInfo.SetExecutableFile(f, True) + + DumperBase.warn("TARGET: %s" % self.target) + self.process = self.target.Launch(launchInfo, error) + DumperBase.warn("PROCESS: %s" % self.process) + if not error.Success(): self.report(self.describeError(error)) self.reportState('enginerunfailed') return + # Even if it stops it seems that LLDB assumes it is running # and later detects that it did stop after all, so it is be # better to mirror that and wait for the spontaneous stop. self.reportState('enginerunandinferiorrunok') + elif self.startMode_ == DebuggerStartMode.AttachCore: coreFile = args.get('coreFile', '') self.process = self.target.LoadCore(coreFile) @@ -949,14 +989,6 @@ class Dumper(DumperBase): return self.report('pid="%s"' % self.process.GetProcessID()) self.reportState('enginerunandinferiorrunok') - if self.target is not None: - broadcaster = self.target.GetBroadcaster() - listener = self.debugger.GetListener() - broadcaster.AddListener(listener, lldb.SBProcess.eBroadcastBitStateChanged) - listener.StartListeningForEvents(broadcaster, lldb.SBProcess.eBroadcastBitStateChanged) - broadcaster.AddListener(listener, lldb.SBTarget.eBroadcastBitBreakpointChanged) - listener.StartListeningForEvents( - broadcaster, lldb.SBTarget.eBroadcastBitBreakpointChanged) def loop(self): event = lldb.SBEvent() -- cgit v1.2.3