12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #!/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
|