[ABRT PATCH] don't require debuginfo for vmcore analysis rhbz#768389

Richard Marko rmarko at redhat.com
Wed Aug 28 13:47:12 UTC 2013


Pushed. Thanks!

On 08/28/2013 12:02 PM, Jiri Moskovcak wrote:
> Signed-off-by: Jiri Moskovcak <jmoskovc at redhat.com>
> ---
>  doc/abrt-action-analyze-vmcore.txt        |  6 --
>  src/plugins/abrt-action-analyze-vmcore.in | 93 ++++++-------------------------
>  2 files changed, 16 insertions(+), 83 deletions(-)
>
> diff --git a/doc/abrt-action-analyze-vmcore.txt b/doc/abrt-action-analyze-vmcore.txt
> index 3e016f5..20a28c2 100644
> --- a/doc/abrt-action-analyze-vmcore.txt
> +++ b/doc/abrt-action-analyze-vmcore.txt
> @@ -38,15 +38,9 @@ OPTIONS
>  -v::
>     Be more verbose. Can be given multiple times.
>  
> ---cache=DIR1[:DIR2]::
> -   Additional debuginfo directories (Default: /var/cache/abrt-di)
> -
>  --core=VMCORE::
>     Path to vmcore to analyze (Default: ./vmcore)
>  
> ---tmpdir=TMPDIR::
> -   Where to store temporary files (Default: /tmp/abrt-tmp-debuginfo-<time>-<pid>)
> -
>  AUTHORS
>  -------
>  * ABRT team
> diff --git a/src/plugins/abrt-action-analyze-vmcore.in b/src/plugins/abrt-action-analyze-vmcore.in
> index 6c27e9a..78a7b19 100644
> --- a/src/plugins/abrt-action-analyze-vmcore.in
> +++ b/src/plugins/abrt-action-analyze-vmcore.in
> @@ -7,8 +7,6 @@ from subprocess import Popen, PIPE
>  import os
>  import sys
>  from reportclient import _, verbose, set_verbosity, error_msg_and_die, error_msg
> -import time
> -from reportclient.debuginfo import DebugInfoDownload
>  import getopt
>  
>  PROGNAME = "abrt-action-analyze-vmcore"
> @@ -20,15 +18,16 @@ RETURN_FAILURE = 2
>  
>  ver = ""
>  if __name__ == "__main__":
> +    dmesg_log = "dmesg_log"
>      cachedirs = []
>      vmlinux_di_cachedir = ""
>      vmlinux_di_path = ""
>      tmpdir = ""
>      vmcore = ""
>  
> -    help_text = _("Usage: {0} [-v[v]] [--core=VMCORE] [--tmpdir=TMPDIR] [--cache=CACHEDIR]").format(PROGNAME)
> +    help_text = _("Usage: {0} [-v[v]] [--core=VMCORE]").format(PROGNAME)
>      try:
> -        opts, args = getopt.getopt(sys.argv[1:], "hvd", ["help", "tmpdir=", "cache=", "core="])
> +        opts, args = getopt.getopt(sys.argv[1:], "hvd", ["help", "core="])
>      except getopt.GetoptError, err:
>          error_msg(str(err)) # prints something like "option -a not recognized"
>          error_msg_and_die(help_text)
> @@ -38,15 +37,8 @@ if __name__ == "__main__":
>          if opt in ("-h", "--help"):
>              print help_text
>              exit(0)
> -        if opt == "--cache":
> -            cachedirs = arg.split(':')
> -            usercache = True
>          elif opt == "-v":
>              verbose += 1
> -        elif opt == "--core":
> -            vmcore = arg
> -        elif opt == "--tmpdir":
> -            tmpdir = arg
>          elif opt in ("-d"):
>              try:
>                  os.chdir(arg)
> @@ -63,74 +55,21 @@ if __name__ == "__main__":
>          print _("File {0} doesn't exist").format(vmcore)
>          sys.exit(RETURN_FAILURE)
>  
> -    if not cachedirs:
> -        try:
> -            fp = open("@sysconfdir@/@PACKAGE_NAME@/plugins/CCpp.conf", "r")
> -            for line in fp:
> -                stripped = line.lstrip()
> -                if len(stripped) == 0:
> -                    continue
> -                if stripped[0] == "#":
> -                    continue
> -                if stripped[:len("DebuginfoLocation")] != "DebuginfoLocation":
> -                    continue
> +    print _("Extracting the oops text from core")
> +    crash = Popen(["makedumpfile", "--dump-dmesg", "-f", vmcore, dmesg_log], stdout=PIPE, stderr=PIPE, bufsize = -1)
> +    out, err = crash.communicate()
>  
> -                cachedirs =  stripped[len("DebuginfoLocation"):].strip(" =\n").split(":")
> -            fp.close()
> -        except IOError as (errno, strerror):
> -            print "I/O error({0}): {1}".format(errno, strerror)
> +    if crash.returncode != 0:
> +        error_msg_and_die(_("Can't process {0}:\n{1}").format(vmcore, err))
>  
> -    if not cachedirs:
> -        cachedirs = ["/var/cache/abrt-di"]
> -
> -    if not tmpdir:
> -        # security people prefer temp subdirs in app's private dir, like /var/run/abrt
> -        # and we switched to /tmp but Fedora feature tmp-on-tmpfs appeared, hence we must
> -        # not use /tmp for potential big data anymore
> -        tmpdir = "@LARGE_DATA_TMP_DIR@/abrt-tmp-debuginfo-%s.%u" % (time.strftime("%Y-%m-%d-%H:%M:%S"), os.getpid())
> -
> -    crash = Popen(["crash", "--osrelease", vmcore], stdout=PIPE, bufsize = -1)
> -    ver, err = crash.communicate()
> -    ver = ver.strip() #remove '\n'
> -    if not ver or crash.returncode != 0:
> -        error_msg_and_die(_("{0} is not a valid vmcore").format(vmcore))
> -
> -    for cachedir in cachedirs:
> -        path = "{0}/usr/lib/debug/lib/modules/{1}/vmlinux".format(cachedir, ver)
> -        if os.path.exists(path):
> -            vmlinux_di_cachedir = cachedir
> -            print _("Required vmlinux debuginfo is installed in {0}".format(vmlinux_di_cachedir))
> -            vmlinux_di_path = path
> -            break
> -
> -    if not vmlinux_di_path: #didn't find the vmlinux in any cachedir
> -        vmlinux_di_cachedir = cachedirs[0] # let's hope it has always at least 1 item
> -        print _("Installing kernel debuginfo(s)")
> -        # replace with abrt-action-install-debuginfo
> -        vmlinux_di_path = "/usr/lib/debug/lib/modules/%s/vmlinux" % ver
> -        if usercache: # if user set the cache, we assume it's writeable for him
> -            downloader = DebugInfoDownload(cache=vmlinux_di_cachedir, tmp=tmpdir, keep_rpms=True)
> -            res = downloader.download([vmlinux_di_path], download_exact_files=True)
> -            if res != RETURN_OK:
> -                error_msg_and_die(_("Can't download required debuginfo"))
> -            vmlinux_di_path = "{0}/usr/lib/debug/lib/modules/{1}/vmlinux".format(vmlinux_di_cachedir, ver)
> -        else: # we need to use the suid wrapper, if we use the default cache
> -            downloader_args = ["/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache", "--size_mb=4096", "--exact={0}".format(vmlinux_di_path)]
> -            if verbose > 0:
> -                downloader_args.append("-{0}".format("v"*verbose))
> -            downloader = Popen(downloader_args, bufsize = -1)
> -            res = downloader.wait()
> -            if res != 0:
> -                error_msg_and_die(_("Can't download required debuginfo"))
> -            vmlinux_di_path = "{0}/usr/lib/debug/lib/modules/{1}/vmlinux".format(vmlinux_di_cachedir, ver)
> -
> -    print _("Generating backtrace")
> -    log_file = open("kernel_log","w")
> -    crash = Popen(["crash", "-s", "vmcore", vmlinux_di_path], stdin=PIPE, stderr=PIPE, stdout=log_file, bufsize = -1)
> -    out, err = crash.communicate(input="log")
> -    log_file.close()
>      backtrace_file = open("backtrace", "w")
> -    dump_oops = Popen(["abrt-dump-oops", "-u", ".", "kernel_log"], stdout=backtrace_file, bufsize=-1)
> +    dump_oops = Popen(["abrt-dump-oops", "-u", ".", dmesg_log], stdout=backtrace_file, stderr=PIPE, bufsize=-1)
> +    out, err = dump_oops.communicate()
>      backtrace_file.close()
> -    ret = dump_oops.wait()
> +    ret = dump_oops.returncode
> +    if dump_oops.returncode != 0:
> +        print _("Can't extract the oops message: '{0}'").format(err)
> +        sys.exit(ret)
> +
> +    print _("Oops text extracted successfully")
>      sys.exit(ret)


-- 
Richard Marko



More information about the Crash-catcher mailing list