def try_hard_to_name(self, addr): def result(codebuf): return '%s:%s:%s' % (codebuf.co_filename, codebuf.co_name, codebuf.get_next_instr()) codebuf = xam.codeat(addr) if codebuf is not None: codemap = codebuf.codemap proxylist = [] for lineaddr in range(addr, codebuf.addr-1, -1): if codemap.has_key(lineaddr): for proxy in codemap[lineaddr]: if proxy.co_name: return result(proxy) if codebuf.co_name: return result(codebuf) else: return '?'
def try_hard_to_name(self, addr): def result(codebuf): return '%s:%s:%s' % (codebuf.co_filename, codebuf.co_name, codebuf.get_next_instr()) codebuf = xam.codeat(addr) if codebuf is not None: codemap = codebuf.codemap proxylist = [] for lineaddr in range(addr, codebuf.addr - 1, -1): if codemap.has_key(lineaddr): for proxy in codemap[lineaddr]: if proxy.co_name: return result(proxy) if codebuf.co_name: return result(codebuf) else: return '?'
def send_head(self): global codebufs # CT self.trace_prev = None self.trace_next = None self.trace_addr = () if self.path == '/' or self.path == '/all': all = self.path == '/all' if all: title = 'List of ALL code objects' else: title = 'List of all named code objects' data = ['<ul>'] named = 0 proxies = 0 for codebuf in codebufs: if codebuf.data and codebuf.co_name: named += 1 else: if not codebuf.data: proxies += 1 if not all: continue data.append( '<li>%s:\t%s:\t%s:\t%s\t(%d bytes)</li>\n' % (codebuf.co_filename, codebuf.co_name, codebuf.get_next_instr(), self.symhtml(codebuf, codebuf.addr), len(codebuf.data))) data.append('</ul>\n') data.append('<br><a href="/">%d named buffers</a>; ' % named + '<a href="/all">%d buffers in total</a>, ' % len(codebufs) + 'including %d proxies' % proxies) data = ''.join(data) return self.donepage(title, data) match = re_codebuf.match(self.path) if match: addr = long(match.group(1), 16) codebuf = xam.codeat(addr) if not codebuf: self.send_error(404, "No code buffer at this address") return None if codebuf.addr != addr: self.trace_addr = [addr] title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), codebuf.addr) data = self.bufferpage(codebuf) return self.donepage(title, data) match = re_trace.match(self.path) if match: tracepos = int(match.group(1), 16) f = open(tracefilename, 'rb') try: def traceat(p, f=f): f.seek(p) data = f.read(4) if len(data) == 4: addr, = struct.unpack('L', data) return addr else: raise IOError addr = traceat(tracepos) codebuf = xam.codeat(addr) if not codebuf: self.send_error(404, "No code buffer at 0x%x" % addr) return None start = codebuf.addr end = start + len(codebuf.data) while tracepos > 0: addr1 = traceat(tracepos - 4) if not (start <= addr1 < addr): break tracepos -= 4 addr = addr1 self.trace_prev = tracepos - 4 self.trace_addr = [] while 1: self.trace_addr.append(addr) addr1 = traceat(tracepos + 4) if not (addr < addr1 < end): break tracepos += 4 addr = addr1 self.trace_next = tracepos + 4 finally: f.close() title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), codebuf.addr) data = self.bufferpage(codebuf) return self.donepage(title, data) match = re_traces.match(self.path) if match: traceaddr = long(match.group(1), 16) f = open(tracefilename, 'rb') plist = find4(f, struct.pack('L', traceaddr)) f.close() title = 'Traces through 0x%x' % traceaddr data = ['<ul>'] for p in plist: data.append("<li><a href='/trace0x%x'>0x%x</a>\n" % (p, p)) data.append('</ul>') data = ''.join(data) return self.donepage(title, data) match = re_trlist.match(self.path) if match: start = int(match.group(1), 16) end = int(match.group(2), 16) title = 'Traces timed 0x%x to 0x%x' % (start, end) data = [ "<p><a href='/trace0x%x-0x%x'><<<<</a></p>\n" % (start - (end - start), start), '<ul>' ] f = open(tracefilename, 'rb') f.seek(start) prevname = None for p in range(start, end, 4): addr, = struct.unpack('L', f.read(4)) s = self.try_hard_to_name(addr) if s == prevname: continue data.append("<li><a href='/trace0x%x'>0x%x: %s</a>\n" % (p, p, s)) prevname = s data.append('</ul>') data.append( "<p><a href='/trace0x%x-0x%x'>>>>></a></p>\n" % (end, end + (end - start))) f.close() data = ''.join(data) return self.donepage(title, data) match = re_proxy.match(self.path) if match: title = 'Snapshot' n = int(match.group(1)) proxy = codebufs[n] for n1 in xrange(n - 1, -1, -1): pprev = codebufs[n1] if (pprev.nextinstr == proxy.nextinstr and pprev.co_name == proxy.co_name and pprev.co_filename == proxy.co_filename): pprev = n1 break else: pprev = None for n1 in xrange(n + 1, len(codebufs)): pnext = codebufs[n1] if (pnext.nextinstr == proxy.nextinstr and pnext.co_name == proxy.co_name and pnext.co_filename == proxy.co_filename): pnext = n1 break else: pnext = None filename = os.path.join(DIRECTORY, proxy.co_filename) co = cache_load(filename, proxy.co_name) data = '<p>PsycoObject structure at this point:' data += ' ' * 20 data += '[' data += ' <a href="summary%d">summary</a> ' % n if pprev is not None or pnext is not None: if pprev is not None: data += ' <a href="proxy%d"><<< previous</a> ' % pprev if pnext is not None: data += ' <a href="proxy%d">next >>></a> ' % pnext data += ']' data += '</p>\n' data += show_vinfos(proxy.vlocals, {}, co) data += '<hr><p>Disassembly of %s:%s:%s:</p>\n' % ( proxy.co_filename, proxy.co_name, proxy.get_next_instr()) if co is None: #moduledata is None: txt = "(exception while loading the file '%s')\n" % (filename) else: if not hasattr(co, 'co_code'): txt = "(no function object '%s' in file '%s')\n" % ( proxy.co_name, filename) else: txt = cStringIO.StringIO() oldstdout = sys.stdout try: sys.stdout = txt dis.disassemble(co, proxy.get_next_instr()) finally: sys.stdout = oldstdout txt = txt.getvalue() data += '<pre>%s</pre>\n' % txt data += "<br><a href='/0x%x'>Back</a>\n" % proxy.addr return self.donepage(title, data) match = re_summary.match(self.path) if match: n = int(match.group(1)) proxy = codebufs[n] data = summary_vinfos(proxy.vlocals, {}) f = cStringIO.StringIO(data) self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() return f if self.path == '/checkall': for codebuf in codebufs: codebuf.cache_text f = cStringIO.StringIO('done') self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() return f ## CT: simple reload feature if self.path == "/reload": codebufs = xam.readdump(FILENAME) self.path = "/all" return self.send_head() self.send_error(404, "Invalid path") return None
def send_head(self): global codebufs # CT self.trace_prev = None self.trace_next = None self.trace_addr = () if self.path == '/' or self.path == '/all': all = self.path == '/all' if all: title = 'List of ALL code objects' else: title = 'List of all named code objects' data = ['<ul>'] named = 0 proxies = 0 for codebuf in codebufs: if codebuf.data and codebuf.co_name: named += 1 else: if not codebuf.data: proxies += 1 if not all: continue data.append('<li>%s:\t%s:\t%s:\t%s\t(%d bytes)</li>\n' % ( codebuf.co_filename, codebuf.co_name, codebuf.get_next_instr(), self.symhtml(codebuf, codebuf.addr), len(codebuf.data))) data.append('</ul>\n') data.append('<br><a href="/">%d named buffers</a>; ' % named + '<a href="/all">%d buffers in total</a>, ' % len(codebufs) + 'including %d proxies' % proxies) data = ''.join(data) return self.donepage(title, data) match = re_codebuf.match(self.path) if match: addr = long(match.group(1), 16) codebuf = xam.codeat(addr) if not codebuf: self.send_error(404, "No code buffer at this address") return None if codebuf.addr != addr: self.trace_addr = [addr] title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), codebuf.addr) data = self.bufferpage(codebuf) return self.donepage(title, data) match = re_trace.match(self.path) if match: tracepos = int(match.group(1), 16) f = open(tracefilename, 'rb') try: def traceat(p, f=f): f.seek(p) data = f.read(4) if len(data) == 4: addr, = struct.unpack('L', data) return addr else: raise IOError addr = traceat(tracepos) codebuf = xam.codeat(addr) if not codebuf: self.send_error(404, "No code buffer at 0x%x" % addr) return None start = codebuf.addr end = start + len(codebuf.data) while tracepos > 0: addr1 = traceat(tracepos-4) if not (start <= addr1 < addr): break tracepos -= 4 addr = addr1 self.trace_prev = tracepos-4 self.trace_addr = [] while 1: self.trace_addr.append(addr) addr1 = traceat(tracepos+4) if not (addr < addr1 < end): break tracepos += 4 addr = addr1 self.trace_next = tracepos+4 finally: f.close() title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), codebuf.addr) data = self.bufferpage(codebuf) return self.donepage(title, data) match = re_traces.match(self.path) if match: traceaddr = long(match.group(1), 16) f = open(tracefilename, 'rb') plist = find4(f, struct.pack('L', traceaddr)) f.close() title = 'Traces through 0x%x' % traceaddr data = ['<ul>'] for p in plist: data.append("<li><a href='/trace0x%x'>0x%x</a>\n" % (p, p)) data.append('</ul>') data = ''.join(data) return self.donepage(title, data) match = re_trlist.match(self.path) if match: start = int(match.group(1), 16) end = int(match.group(2), 16) title = 'Traces timed 0x%x to 0x%x' % (start, end) data = ["<p><a href='/trace0x%x-0x%x'><<<<</a></p>\n" % (start-(end-start), start), '<ul>'] f = open(tracefilename, 'rb') f.seek(start) prevname = None for p in range(start, end, 4): addr, = struct.unpack('L', f.read(4)) s = self.try_hard_to_name(addr) if s == prevname: continue data.append("<li><a href='/trace0x%x'>0x%x: %s</a>\n" % (p,p,s)) prevname = s data.append('</ul>') data.append( "<p><a href='/trace0x%x-0x%x'>>>>></a></p>\n" % (end, end+(end-start))) f.close() data = ''.join(data) return self.donepage(title, data) match = re_proxy.match(self.path) if match: title = 'Snapshot' n = int(match.group(1)) proxy = codebufs[n] for n1 in xrange(n-1, -1, -1): pprev = codebufs[n1] if (pprev.nextinstr == proxy.nextinstr and pprev.co_name == proxy.co_name and pprev.co_filename == proxy.co_filename): pprev = n1 break else: pprev = None for n1 in xrange(n+1, len(codebufs)): pnext = codebufs[n1] if (pnext.nextinstr == proxy.nextinstr and pnext.co_name == proxy.co_name and pnext.co_filename == proxy.co_filename): pnext = n1 break else: pnext = None filename = os.path.join(DIRECTORY, proxy.co_filename) co = cache_load(filename, proxy.co_name) data = '<p>PsycoObject structure at this point:' data += ' ' * 20 data += '[' data += ' <a href="summary%d">summary</a> ' % n if pprev is not None or pnext is not None: if pprev is not None: data += ' <a href="proxy%d"><<< previous</a> ' % pprev if pnext is not None: data += ' <a href="proxy%d">next >>></a> ' % pnext data += ']' data += '</p>\n' data += show_vinfos(proxy.vlocals, {}, co) data += '<hr><p>Disassembly of %s:%s:%s:</p>\n' % ( proxy.co_filename, proxy.co_name, proxy.get_next_instr()) if co is None: #moduledata is None: txt = "(exception while loading the file '%s')\n" % ( filename) else: if not hasattr(co, 'co_code'): txt = "(no function object '%s' in file '%s')\n" % ( proxy.co_name, filename) else: txt = cStringIO.StringIO() oldstdout = sys.stdout try: sys.stdout = txt dis.disassemble(co, proxy.get_next_instr()) finally: sys.stdout = oldstdout txt = txt.getvalue() data += '<pre>%s</pre>\n' % txt data += "<br><a href='/0x%x'>Back</a>\n" % proxy.addr return self.donepage(title, data) match = re_summary.match(self.path) if match: n = int(match.group(1)) proxy = codebufs[n] data = summary_vinfos(proxy.vlocals, {}) f = cStringIO.StringIO(data) self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() return f if self.path == '/checkall': for codebuf in codebufs: codebuf.cache_text f = cStringIO.StringIO('done') self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() return f ## CT: simple reload feature if self.path == "/reload": codebufs = xam.readdump(FILENAME) self.path = "/all" return self.send_head() self.send_error(404, "Invalid path") return None