Alexey, I'm not sure what you want me to do with this. Seems like a good candidate to be put on the upstream web page, maybe in the "Python Scripts" section, separated from, but next to the "mpykdump.so" section. Dave ----- Original Message ----- > Add simple script with caching (just one startup can take quite some time and > it saved hours during debugging). > > Script expects 2 symlinks ("crash vmlinux core") and is designed > for post-mortem analysis. > > Script contains one example: fetching all inodes. > > Basically it is an example on how to run "crash" from Python. > --- > > diff --git a/contrib/crash.py b/contrib/crash.py > new file mode 100755 > index 0000000..8dae0e1 > --- /dev/null > +++ b/contrib/crash.py > @@ -0,0 +1,88 @@ > +#!/usr/bin/python2 > +import hashlib > +import os > +import subprocess > +import tempfile > + > +# create "vmlinux" and "core" symlinks before running > +#CRASH='/usr/bin/crash' > +CRASH=os.path.join(os.path.expanduser('~'), 'bin', 'crash') > + > +# split() without empty strings > +def xsplit(s, c): > + i = 0 > + while True: > + j = s.find(c, i) > + if j == -1: > + if i == len(s): > + return > + yield s[i:] > + return > + elif i == j: > + i = i + 1 > + continue > + else: > + yield s[i:j] > + i = j + 1 > + > +_CRASH_CACHE_DIR='.crash' > +def crash(cmd): > + idx = cmd.find('\n') > + if idx >= 0: > + print 'CRASH "%s" ...' % cmd[:idx] > + else: > + print 'CRASH "%s"' % cmd > + > + try: > + os.mkdir(_CRASH_CACHE_DIR) > + except OSError: > + pass > + > + cache_filename = os.path.join(_CRASH_CACHE_DIR, > hashlib.sha1(cmd).hexdigest()) > + if os.path.isfile(cache_filename): > + with open(cache_filename, 'r') as f: > + return f.read() > + > + fd, filename = tempfile.mkstemp() > + f = os.fdopen(fd, 'w') > + f.write(cmd) > + if cmd[-1] != '\n': > + f.write('\n') > + f.write('q\n') > + f.close() > + > + with open(filename, 'r') as f: > + x = subprocess.check_output([CRASH, '-s', 'vmlinux', 'core'], > stdin=f) > + os.unlink(filename) > + > + with open(cache_filename, 'w+') as f: > + f.write(x) > + return x > + > +def make_cmd(fmt, it): > + return '\n'.join(map(lambda x: fmt % x, it)) > + > +#def struct_inode(): > +# cmd = 'list -H super_blocks super_block.s_list' > +# x = crash(cmd) > +# list_sb = map(lambda x: int(x, 16), xsplit(x, '\n')) > +# > +# cmd = 'struct super_block.s_inodes' > +# x = crash(cmd) > +# s = [line for line in xsplit(x, '\n')] > +# OFFSETOF_STRUCT_INODE_S_INODES = int(s[1].split()[0][1:-1]) > +# > +## set_inode = set() > +## for sb in list_sb: > +## cmd = 'list -H %x inode.i_sb_list' % (sb + > OFFSETOF_STRUCT_INODE_S_INODES) > +## x = crash(cmd) > +## set_inode.update(map(lambda x: int(x, 16), xsplit(x, '\n'))) > +## print len(set_inode) > +# > +# set_inode = set() > +# cmd = make_cmd('list -H %x inode.i_sb_list', map(lambda x: x + > OFFSETOF_STRUCT_INODE_S_INODES, list_sb)) > +# x = crash(cmd) > +# set_inode = set(map(lambda x: int(x, 16), xsplit(x, '\n'))) > +# print len(set_inode) > +# > +#struct_inode() > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility