from lldbutil.py to the lldb.py proper. The in_range() function becomes a function in
the lldb module. And the symbol_iter() function becomes a method within the SBModule
called symbol_in_section_iter(). Example:
# Iterates the text section and prints each symbols within each sub-section.
for subsec in text_sec:
print INDENT + repr(subsec)
for sym in exe_module.symbol_in_section_iter(subsec):
print INDENT2 + repr(sym)
print INDENT2 + 'symbol type: %s' % symbol_type_to_str(sym.GetType())
might produce this following output:
[0x0000000100001780-0x0000000100001d5c) a.out.__TEXT.__text
id = {0x00000004}, name = 'mask_access(MaskAction, unsigned int)', range = [0x00000001000017c0-0x0000000100001870)
symbol type: code
id = {0x00000008}, name = 'thread_func(void*)', range = [0x0000000100001870-0x00000001000019b0)
symbol type: code
id = {0x0000000c}, name = 'main', range = [0x00000001000019b0-0x0000000100001d5c)
symbol type: code
id = {0x00000023}, name = 'start', address = 0x0000000100001780
symbol type: code
[0x0000000100001d5c-0x0000000100001da4) a.out.__TEXT.__stubs
id = {0x00000024}, name = '__stack_chk_fail', range = [0x0000000100001d5c-0x0000000100001d62)
symbol type: trampoline
id = {0x00000028}, name = 'exit', range = [0x0000000100001d62-0x0000000100001d68)
symbol type: trampoline
id = {0x00000029}, name = 'fflush', range = [0x0000000100001d68-0x0000000100001d6e)
symbol type: trampoline
id = {0x0000002a}, name = 'fgets', range = [0x0000000100001d6e-0x0000000100001d74)
symbol type: trampoline
id = {0x0000002b}, name = 'printf', range = [0x0000000100001d74-0x0000000100001d7a)
symbol type: trampoline
id = {0x0000002c}, name = 'pthread_create', range = [0x0000000100001d7a-0x0000000100001d80)
symbol type: trampoline
id = {0x0000002d}, name = 'pthread_join', range = [0x0000000100001d80-0x0000000100001d86)
symbol type: trampoline
id = {0x0000002e}, name = 'pthread_mutex_lock', range = [0x0000000100001d86-0x0000000100001d8c)
symbol type: trampoline
id = {0x0000002f}, name = 'pthread_mutex_unlock', range = [0x0000000100001d8c-0x0000000100001d92)
symbol type: trampoline
id = {0x00000030}, name = 'rand', range = [0x0000000100001d92-0x0000000100001d98)
symbol type: trampoline
id = {0x00000031}, name = 'strtoul', range = [0x0000000100001d98-0x0000000100001d9e)
symbol type: trampoline
id = {0x00000032}, name = 'usleep', range = [0x0000000100001d9e-0x0000000100001da4)
symbol type: trampoline
[0x0000000100001da4-0x0000000100001e2c) a.out.__TEXT.__stub_helper
[0x0000000100001e2c-0x0000000100001f10) a.out.__TEXT.__cstring
[0x0000000100001f10-0x0000000100001f68) a.out.__TEXT.__unwind_info
[0x0000000100001f68-0x0000000100001ff8) a.out.__TEXT.__eh_frame
llvm-svn: 140830
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
"""
|
|
Test some SBModule and SBSection APIs.
|
|
"""
|
|
|
|
import os, time
|
|
import re
|
|
import unittest2
|
|
import lldb
|
|
from lldbtest import *
|
|
from lldbutil import symbol_iter, symbol_type_to_str
|
|
|
|
class ModuleAndSectionAPIsTestCase(TestBase):
|
|
|
|
mydir = os.path.join("python_api", "module_section")
|
|
|
|
@python_api_test
|
|
def test_module_and_section(self):
|
|
"""Test module and section APIs."""
|
|
self.buildDefault()
|
|
self.module_and_section()
|
|
|
|
def module_and_section(self):
|
|
exe = os.path.join(os.getcwd(), "a.out")
|
|
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target, VALID_TARGET)
|
|
self.assertTrue(target.GetNumModules() > 0)
|
|
|
|
# Hide stdout if not running with '-t' option.
|
|
if not self.TraceOn():
|
|
self.HideStdout()
|
|
|
|
print "Number of modules for the target: %d" % target.GetNumModules()
|
|
for module in target.module_iter():
|
|
print module
|
|
|
|
# Get the executable module at index 0.
|
|
exe_module = target.GetModuleAtIndex(0)
|
|
|
|
print "Exe module: %s" % repr(exe_module)
|
|
print "Number of sections: %d" % exe_module.GetNumSections()
|
|
INDENT = ' ' * 4
|
|
INDENT2 = INDENT * 2
|
|
for sec in exe_module.section_iter():
|
|
print sec
|
|
print INDENT + "Number of subsections: %d" % sec.GetNumSubSections()
|
|
if sec.GetNumSubSections() == 0:
|
|
for sym in exe_module.symbol_in_section_iter(sec):
|
|
print INDENT + repr(sym)
|
|
print INDENT + "symbol type: %s" % symbol_type_to_str(sym.GetType())
|
|
else:
|
|
for subsec in sec:
|
|
print INDENT + repr(subsec)
|
|
# Now print the symbols belonging to the subsection....
|
|
for sym in exe_module.symbol_in_section_iter(subsec):
|
|
print INDENT2 + repr(sym)
|
|
print INDENT2 + "symbol type: %s" % symbol_type_to_str(sym.GetType())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import atexit
|
|
lldb.SBDebugger.Initialize()
|
|
atexit.register(lambda: lldb.SBDebugger.Terminate())
|
|
unittest2.main()
|