[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