summaryrefslogtreecommitdiff
path: root/share/qtcreator/debugger/lldbbridge.py
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-03-06 12:04:47 +0100
committerhjk <hjk121@nokiamail.com>2014-03-07 12:49:31 +0100
commit8931a14afe50045537c30865183a679d96c7a79d (patch)
tree822c6e220aeda0c908f187066432b4407368996d /share/qtcreator/debugger/lldbbridge.py
parentfed6b8bdd0609b18a6618bbd4b53f586d0bea482 (diff)
downloadqt-creator-8931a14afe50045537c30865183a679d96c7a79d.tar.gz
Debugger: Select topmost frame with usable data also with LLDB
Task-number: QTCREATORBUG-11597 Change-Id: I5d95c9172e90b82f5671427283cf46e924456c4c Reviewed-by: Christian Stenger <christian.stenger@digia.com>
Diffstat (limited to 'share/qtcreator/debugger/lldbbridge.py')
-rw-r--r--share/qtcreator/debugger/lldbbridge.py57
1 files changed, 35 insertions, 22 deletions
diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py
index dabd4587b8..c1ccf4f8ae 100644
--- a/share/qtcreator/debugger/lldbbridge.py
+++ b/share/qtcreator/debugger/lldbbridge.py
@@ -831,16 +831,10 @@ class Dumper(DumperBase):
if not thread:
self.report('msg="No thread"')
return
- frame = thread.GetSelectedFrame()
- if frame:
- frameId = frame.GetFrameID()
- else:
- frameId = 0;
(n, isLimited) = (limit, True) if limit > 0 else (thread.GetNumFrames(), False)
- result = 'stack={current-frame="%s"' % frameId
- result += ',current-thread="%s"' % thread.GetThreadID()
+ result = 'stack={current-thread="%s"' % thread.GetThreadID()
result += ',frames=['
for i in xrange(n):
frame = thread.GetFrameAtIndex(i)
@@ -849,14 +843,12 @@ class Dumper(DumperBase):
break
lineEntry = frame.GetLineEntry()
line = lineEntry.GetLine()
- usable = line != 0
result += '{pc="0x%x"' % frame.GetPC()
result += ',level="%d"' % frame.idx
result += ',addr="0x%x"' % frame.GetPCAddress().GetLoadAddress(self.target)
result += ',func="%s"' % frame.GetFunctionName()
result += ',line="%d"' % line
result += ',fullname="%s"' % fileName(lineEntry.file)
- result += ',usable="%d"' % usable
result += ',file="%s"},' % fileName(lineEntry.file)
result += ']'
result += ',hasmore="%d"' % isLimited
@@ -864,6 +856,20 @@ class Dumper(DumperBase):
result += '}'
self.report(result)
+ def reportStackPosition(self):
+ thread = self.currentThread()
+ if not thread:
+ self.report('msg="No thread"')
+ return
+ frame = thread.GetSelectedFrame()
+ if frame:
+ self.report('stack-position={id="%s"}' % frame.GetFrameID())
+ else:
+ self.report('stack-position={id="-1"}')
+
+ def reportStackTop(self):
+ self.report('stack-top={}')
+
def putBetterType(self, type):
try:
self.currentType = type.GetName()
@@ -1196,8 +1202,8 @@ class Dumper(DumperBase):
state = self.process.GetState()
if state == lldb.eStateStopped:
self.reportStack()
+ self.reportStackPosition()
self.reportThreads()
- self.reportLocation()
self.reportVariables()
def reportRegisters(self, _ = None):
@@ -1284,10 +1290,8 @@ class Dumper(DumperBase):
stoppedThread = self.firstStoppedThread()
if stoppedThread:
self.process.SetSelectedThread(stoppedThread)
- usableFrame = self.firstUsableFrame(stoppedThread)
- if usableFrame:
- stoppedThread.SetSelectedFrame(usableFrame)
self.reportStack({'stacklimit': 20})
+ self.reportStackTop()
self.reportThreads()
self.reportLocation()
self.reportVariables()
@@ -1564,9 +1568,7 @@ class Dumper(DumperBase):
self.currentThread().SetSelectedFrame(args['index'])
state = self.process.GetState()
if state == lldb.eStateStopped:
- self.reportStack(args)
- self.reportThreads()
- self.reportLocation()
+ self.reportStackPosition()
self.reportVariables()
def selectThread(self, args):
@@ -1601,19 +1603,30 @@ class Dumper(DumperBase):
self.reportVariables(args)
def disassemble(self, args):
- frame = self.currentFrame();
- function = frame.GetFunction()
- name = function.GetName()
+ functionName = args.get('function', '')
+ flavor = args.get('flavor', '')
+ function = None
+ if len(functionName):
+ functions = self.target.FindFunctions(functionName).functions
+ if len(functions):
+ function = functions[0]
+ if function:
+ base = function.GetStartAddress().GetLoadAddress(self.target)
+ instructions = function.GetInstructions(self.target)
+ else:
+ base = args.get('address', 0)
+ addr = lldb.SBAddress(base, self.target)
+ instructions = self.target.ReadInstructions(addr, 100)
+
result = 'disassembly={cookie="%s",' % args['cookie']
result += ',lines=['
- base = function.GetStartAddress().GetLoadAddress(self.target)
- for insn in function.GetInstructions(self.target):
+ for insn in instructions:
comment = insn.GetComment(self.target)
addr = insn.GetAddress().GetLoadAddress(self.target)
result += '{address="%s"' % addr
result += ',inst="%s %s"' % (insn.GetMnemonic(self.target),
insn.GetOperands(self.target))
- result += ',func_name="%s"' % name
+ result += ',func_name="%s"' % functionName
if comment:
result += ',comment="%s"' % comment
result += ',offset="%s"},' % (addr - base)