Trees | Indices | Help |
---|
|
1 import os 2 import tempfile 3 import threading 4 import subprocess 5 6 import envi.memory as e_mem 7 8 import vtrace 9 import vtrace.archs.arm as v_arm 10 import vtrace.platforms.base as v_base 11 import vtrace.platforms.posix as v_posix 12 import vtrace.platforms.gdbstub as v_gdbstub 13 14 from cStringIO import StringIO 15 16 platdir = os.path.dirname(__file__) 17 targdir = '/data/local/tmp/' 18 19 gdbserver_arm = 'gdbserver_arm_4.3.3' 20 gdbserver_arm_path = os.path.join(platdir, 'gdbbins', gdbserver_arm) 21 22 gdbserver_arm_targ = targdir + gdbserver_arm 23 2628 t = adbCommand('adb','shell','ls',targdir) 29 if t.find(gdbserver_arm) == -1: 30 adbCommand('adb','push',gdbserver_arm_path,targdir) 31 adbCommand('adb','shell','chmod','755', gdbserver_arm_targ)3234 fd = tempfile.NamedTemporaryFile() 35 adbCommand('adb','pull', fname, fd.name) 36 return file(fd.name, 'r+b')37 38 arm_regfmt = '<16I96sI' 39 arm_regnames = ["r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","sl","fp","ip","sp", "lr","pc", None, "cpsr"] 4041 -class AndroidArmTrace( 42 vtrace.Trace, 43 v_gdbstub.GdbStubMixin, 44 v_arm.ArmMixin, 45 v_posix.ElfMixin, 46 v_base.TracerBase):47151 #output = adbCommand('adb','shell','cat',filename) 152 #return StringIO(output) 15349 vtrace.Trace.__init__(self, archname='arm') 50 v_base.TracerBase.__init__(self) 51 v_gdbstub.GdbStubMixin.__init__(self) 52 v_arm.ArmMixin.__init__(self) 53 v_posix.ElfMixin.__init__(self) 54 55 self._gdbSetRegisterInfo(arm_regfmt, arm_regnames) 56 57 self._gdb_filemagic = '\x7fELF' 58 59 self.setMeta('Platform', 'android') 60 61 self.avd = avd 62 self.gdbserver = None6365 66 port = 33221 67 68 checkGdbServer() 69 70 gserver = ['adb','shell',gdbserver_arm_targ,'0.0.0.0:%d' % port, '--attach', str(pid) ] 71 72 try: 73 self.gdbserver = subprocess.Popen(gserver, 74 stdout=subprocess.PIPE, 75 stdin=subprocess.PIPE) 76 77 # Read the "Attached" and "Listening" output (which delays us long 78 # enough to connect correctly....) 79 # FIXME error check this stuff! 80 l1 = self.gdbserver.stdout.readline() 81 l2 = self.gdbserver.stdout.readline() 82 83 adbCommand('adb','forward','tcp:%d' % port, 'tcp:%d' % port) 84 85 self._gdb_host = 'localhost' 86 self._gdb_port = port 87 88 return v_gdbstub.GdbStubMixin.platformAttach(self, pid) 89 90 except Exception, e: 91 92 if self.gdbserver: 93 self.gdbserver.kill() 94 self.gdbserver = None 95 96 raise9799 maps = [] 100 mapsbuf = adbCommand('adb','shell','cat','/proc/%d/maps' % self.pid) 101 for line in mapsbuf.splitlines(): 102 103 if not line: 104 continue 105 106 perms = 0 107 sline = line.split(" ") 108 addrs = sline[0] 109 permstr = sline[1] 110 fname = sline[-1].strip() 111 addrs = addrs.split("-") 112 base = long(addrs[0],16) 113 max = long(addrs[1],16) 114 mlen = max-base 115 116 if "r" in permstr: 117 perms |= e_mem.MM_READ 118 if "w" in permstr: 119 perms |= e_mem.MM_WRITE 120 if "x" in permstr: 121 perms |= e_mem.MM_EXEC 122 123 maps.append((base,mlen,perms,fname)) 124 125 return maps126 131133 ret = [] 134 135 output = adbCommand('adb','shell','ps') 136 137 for line in output.split('\n'): 138 line = line.strip() 139 140 if not line: 141 continue 142 if line.startswith('USER'): 143 continue 144 145 parts = line.split(None, 8) 146 ret.append( (int(parts[1]), parts[8]) ) 147 return ret148150 return openAndroidFile(filename)155 # Check for adb in path... 156 try: 157 output = adbCommand('adb', 'devices') 158 lines = output.splitlines() 159 if len(lines) <= 2: 160 print('Warning: "adb devices" didnt see an Android device, start/attach one!') 161 162 except Exception, e: 163 raise Exception('Android "adb" command *must* be in your path!') 164 165 return AndroidArmTrace(avd)166
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Fri Nov 16 18:22:16 2012 | http://epydoc.sourceforge.net |