forked from qt-creator/qt-creator
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 <christian.kandeler@qt.io>
This commit is contained in:
@@ -879,7 +879,35 @@ class Dumper(DumperBase):
|
|||||||
self.debugger.SetCurrentPlatformSDKRoot(self.sysRoot_)
|
self.debugger.SetCurrentPlatformSDKRoot(self.sysRoot_)
|
||||||
|
|
||||||
exefile = None if self.attachPid_ > 0 else self.executable_
|
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:
|
if self.nativeMixed:
|
||||||
self.interpreterEventBreakpoint = \
|
self.interpreterEventBreakpoint = \
|
||||||
@@ -918,17 +946,29 @@ class Dumper(DumperBase):
|
|||||||
self.reportState('enginerunandinferiorrunok')
|
self.reportState('enginerunandinferiorrunok')
|
||||||
elif (self.startMode_ == DebuggerStartMode.AttachToRemoteServer
|
elif (self.startMode_ == DebuggerStartMode.AttachToRemoteServer
|
||||||
or self.startMode_ == DebuggerStartMode.AttachToRemoteProcess):
|
or self.startMode_ == DebuggerStartMode.AttachToRemoteProcess):
|
||||||
self.process = self.target.ConnectRemote(
|
|
||||||
self.debugger.GetListener(),
|
f = lldb.SBFileSpec()
|
||||||
self.remoteChannel_, None, error)
|
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():
|
if not error.Success():
|
||||||
self.report(self.describeError(error))
|
self.report(self.describeError(error))
|
||||||
self.reportState('enginerunfailed')
|
self.reportState('enginerunfailed')
|
||||||
return
|
return
|
||||||
|
|
||||||
# Even if it stops it seems that LLDB assumes it is running
|
# 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
|
# and later detects that it did stop after all, so it is be
|
||||||
# better to mirror that and wait for the spontaneous stop.
|
# better to mirror that and wait for the spontaneous stop.
|
||||||
self.reportState('enginerunandinferiorrunok')
|
self.reportState('enginerunandinferiorrunok')
|
||||||
|
|
||||||
elif self.startMode_ == DebuggerStartMode.AttachCore:
|
elif self.startMode_ == DebuggerStartMode.AttachCore:
|
||||||
coreFile = args.get('coreFile', '')
|
coreFile = args.get('coreFile', '')
|
||||||
self.process = self.target.LoadCore(coreFile)
|
self.process = self.target.LoadCore(coreFile)
|
||||||
@@ -949,14 +989,6 @@ class Dumper(DumperBase):
|
|||||||
return
|
return
|
||||||
self.report('pid="%s"' % self.process.GetProcessID())
|
self.report('pid="%s"' % self.process.GetProcessID())
|
||||||
self.reportState('enginerunandinferiorrunok')
|
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):
|
def loop(self):
|
||||||
event = lldb.SBEvent()
|
event = lldb.SBEvent()
|
||||||
|
Reference in New Issue
Block a user