[Crash-utility] [PATCH] crash: add python wrapper script

Dave Anderson anderson at redhat.com
Wed Mar 23 20:10:52 UTC 2016


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()
> 




More information about the Crash-utility mailing list