Added a lldbutil.py module, which contains utility functions which can be used
from scripting applications. An example usage from TestConditionalBreak.py is:
import lldbutil
lldbutil.PrintStackTrace(thread)
./dotest.py -v conditional_break
----------------------------------------------------------------------
Collected 2 tests
test_with_dsym (TestConditionalBreak.ConditionalBreakTestCase)
Exercise some thread and frame APIs to break if c() is called by a(). ... Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`b at main.c:34
frame #2: a.out`a at main.c:25
frame #3: a.out`main at main.c:44
frame #4: a.out`start
Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`b at main.c:34
frame #2: a.out`main at main.c:47
frame #3: a.out`start
Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`a at main.c:27
frame #2: a.out`main at main.c:50
frame #3: a.out`start
ok
test_with_dwarf (TestConditionalBreak.ConditionalBreakTestCase)
Exercise some thread and frame APIs to break if c() is called by a(). ... Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`b at main.c:34
frame #2: a.out`a at main.c:25
frame #3: a.out`main at main.c:44
frame #4: a.out`start
Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`b at main.c:34
frame #2: a.out`main at main.c:47
frame #3: a.out`start
Stack trace for thread id=0x2e03 name=None queue=com.apple.main-thread:
frame #0: a.out`c at main.c:39
frame #1: a.out`a at main.c:27
frame #2: a.out`main at main.c:50
frame #3: a.out`start
ok
----------------------------------------------------------------------
Ran 2 tests in 7.803s
OK
llvm-svn: 113432
This commit is contained in:
parent
67da50e18d
commit
30ee4ef308
|
|
@ -45,6 +45,8 @@ class ConditionalBreakTestCase(TestBase):
|
|||
target = self.dbg.GetSelectedTarget()
|
||||
process = target.GetProcess()
|
||||
thread = process.GetThreadAtIndex(0)
|
||||
import lldbutil
|
||||
lldbutil.PrintStackTrace(thread)
|
||||
|
||||
if thread.GetNumFrames() >= 2:
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
"""
|
||||
LLDB modules which contains miscellaneous utilities.
|
||||
"""
|
||||
|
||||
import lldb
|
||||
|
||||
def GetFunctionNames(thread):
|
||||
"""
|
||||
Returns a sequence of function names from the stack frames of this thread.
|
||||
"""
|
||||
def GetFuncName(i):
|
||||
return thread.GetFrameAtIndex(i).GetFunction().GetName()
|
||||
|
||||
return map(GetFuncName, range(thread.GetNumFrames()))
|
||||
|
||||
|
||||
def GetFilenames(thread):
|
||||
"""
|
||||
Returns a sequence of file names from the stack frames of this thread.
|
||||
"""
|
||||
def GetFilename(i):
|
||||
return thread.GetFrameAtIndex(i).GetLineEntry().GetFileSpec().GetFilename()
|
||||
|
||||
return map(GetFilename, range(thread.GetNumFrames()))
|
||||
|
||||
|
||||
def GetLineNumbers(thread):
|
||||
"""
|
||||
Returns a sequence of line numbers from the stack frames of this thread.
|
||||
"""
|
||||
def GetLineNumber(i):
|
||||
return thread.GetFrameAtIndex(i).GetLineEntry().GetLine()
|
||||
|
||||
return map(GetLineNumber, range(thread.GetNumFrames()))
|
||||
|
||||
|
||||
def GetModuleNames(thread):
|
||||
"""
|
||||
Returns a sequence of module names from the stack frames of this thread.
|
||||
"""
|
||||
def GetModuleName(i):
|
||||
return thread.GetFrameAtIndex(i).GetModule().GetFileSpec().GetFilename()
|
||||
|
||||
return map(GetModuleName, range(thread.GetNumFrames()))
|
||||
|
||||
|
||||
def PrintStackTrace(thread):
|
||||
"""Prints a simple stack trace of this thread."""
|
||||
depth = thread.GetNumFrames()
|
||||
|
||||
mods = GetModuleNames(thread)
|
||||
funcs = GetFunctionNames(thread)
|
||||
files = GetFilenames(thread)
|
||||
lines = GetLineNumbers(thread)
|
||||
|
||||
print "Stack trace for thread id={0:#x} name={1} queue={2}:".format(
|
||||
thread.GetThreadID(), thread.GetName(), thread.GetQueueName())
|
||||
|
||||
for i in range(depth - 1):
|
||||
print " frame #{num}: {mod}`{func} at {file}:{line}".format(
|
||||
num=i, mod=mods[i], func=funcs[i], file=files[i], line=lines[i])
|
||||
|
||||
print " frame #{num}: {mod}`start".format(num=depth-1, mod=mods[depth-1])
|
||||
Loading…
Reference in New Issue