#!/usr/bin/env python3 ''' TODO port this to Python fully. I started it, but then it was hanging on some IO blocking annoyance in the pipeline, and I don't have the time to deal with it, so I'm just going to forward the common options to the old shell script for now... ''' import os import common import lkmc.import_path from shell_helpers import LF class Main(common.LkmcCliFunction): def __init__(self): super().__init__( defaults = { 'show_time': False, }, description='''\ Convert an execution trace containing PC values into the Linux kernel lines executed. ''', ) def timed_main(self): self.sh.run_cmd([ os.path.join(self.env['root_dir'], 'trace2line.sh'), LF, 'true' if self.env['emulator'] == 'gem5' else 'false', LF, self.env['trace_txt_file'], LF, self.get_toolchain_tool('addr2line'), LF, self.env['vmlinux'], LF, self.env['run_dir'], LF, ]) if __name__ == '__main__': Main().cli() # This was the old full Python port attempt that was failing: # import subprocess # import sys # if kwargs['emulator'] == 'gem5': # def get_pc(line): # # TODO # # stdin = sed -r 's/^.* (0x[^. ]*)[. ].*/\1/' "$common_trace_txt_file") # pass # else: # def get_pc(line): # return line.split('=')[-1] # with \ # subprocess.Popen( # [ # self.get_toolchain_tool('addr2line'), # '-e', # kwargs['vmlinux'], # '-f', # '-p', # ], # stdout=subprocess.PIPE, # stdin=subprocess.PIPE, # ) as proc, \ # open(kwargs['trace_txt_file'], 'r') as infile, \ # open(os.path.join(kwargs['run_dir'], 'trace-lines.txt'), 'w') as outfile \ # : # for in_line in infile: # proc.stdin.write(get_pc(in_line).encode()) # proc.stdin.flush() # stdout = proc.stdout.read() # outfile.write(stdout.decode()) # # TODO # # sed -E "s|at ${kwargs['linux_build_dir']}/(\./\|)||" # # uniq -c