#!/bin/bash

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Script to generate stackdumps from a machine or dmp files.

# --- BEGIN COMMON.SH BOILERPLATE ---
# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the script's
# location.
find_common_sh() {
  local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")"))
  local path

  SCRIPT_ROOT=
  for path in "${common_paths[@]}"; do
    if [ -r "${path}/common.sh" ]; then
      SCRIPT_ROOT=${path}
      break
    fi
  done
}

find_common_sh
. "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1)
# --- END COMMON.SH BOILERPLATE ---

. "${SCRIPT_ROOT}/remote_access.sh" || die "Unable to load remote_access.sh"

assert_inside_chroot

MINIDUMP_DUMP=/usr/bin/minidump_dump
MINIDUMP_STACKWALK=/usr/bin/minidump_stackwalk
USING_REMOTE=0

get_default_board

DEFINE_string board "${DEFAULT_BOARD}" \
    "The board for which you are building autotest"
DEFINE_string breakpad_root "" \
    "Path to root of breakpad symbols if pre-existing symbols should be used"
DEFINE_boolean clean ${FLAGS_FALSE} \
    "Remove crash reports from remote system after showing stacks"

function usage() {
  echo "usage: $(basename $0) [--remote=<IP>] [dump...]"
  echo "Specify either a remote IP of a ChromeOS device to gather "
  echo "all crash reports from, or list crash reports"
  exit 1
}

# Clean up remote access and temp files.
function cleanup() {
  [ ${USING_REMOTE} -eq 1 ] && cleanup_remote_access
  rm -rf "${TMP}"
}

# Echoes kind of crash (minidump or kcrash).
function get_kind() {
  local kind="${1##*.}"
  if [ "${kind}" = "dmp" ]; then
    kind="minidump"
  fi
  echo ${kind}
}

# Generate symbols for the given module list.
# Args:
#   $1 - file with a "module" per line.  A module is the full target's
#   path to a DSO or executable that was loaded during a crash.
function generate_symbols() {
  local modules_file="$1"
  local modules=""
  local any_missing=0
  local module_count=0
  for module in $(sort -u "${modules_file}"); do
    local text_file="/build/${FLAGS_board}/${module}"
    local debug_file="/build/${FLAGS_board}/usr/lib/debug/${module}.debug"
    if [ -f "${text_file}" ] && [ -f "${debug_file}" ]; then
      modules="${modules} ${text_file}"
      module_count=$((module_count + 1))
    else
      if [ ${any_missing} -eq 0 ]; then
        warn "Some modules are missing debug information:"
        any_missing=1
      fi
      warn "* ${text_file}"
    fi
  done
  if [ ${module_count} -gt 0 ]; then
    info "Generating breakpad symbols for ${module_count} modules"
    ${SCRIPTS_DIR}/cros_generate_breakpad_symbols --board=${FLAGS_board} \
      ${modules}
  fi
}

function main() {
  FLAGS "$@" || usage
  local basename=$(basename "$0")
  TMP=$(mktemp -d /tmp/${basename}.XXXX)
  trap cleanup EXIT INT TERM
  if [ -n "${FLAGS_remote}" ]; then
    remote_access_init
    USING_REMOTE=1
    learn_board
    local crashes=""
    # File spec of all interesting crashes.  /home/chronos... is
    # listed separately from /mnt/stateful_partition/home/chronos/...
    # because the former may be a mount point for the cryptohome.
    # This allows us to get crashes from the currently logged in
    # user as well as from non-logged in users at once.  We remove
    # duplicate crashes (in case cryptohome is not mounted) below.
    local remote_crash_dirs=" \
        /var/spool/crash \
        /home/chronos/user/crash \
        /mnt/stateful_partition/home/chronos/user/crash"
    local remote_crash_patterns=""
    for remote_crash_dir in ${remote_crash_dirs}; do
      remote_crash_patterns="${remote_crash_patterns} \
                             ${remote_crash_dir}/*.{dmp,kcrash}"
    done
    remote_sh "ls -1 ${remote_crash_patterns}" 2> /dev/null
    local crashes=${REMOTE_OUT}
    # Remove duplicates.
    local unique_crashes=""
    local crash_count=0
    for crash in ${crashes}; do
      local crash_short=$(basename ${crash})
      if echo "${unique_crashes}" | grep -v -q "${crash_short}"; then
        unique_crashes="${unique_crashes} ${crash}"
        crash_count=$((crash_count + 1))
      fi
    done
    if [ ${crash_count} -eq 0 ]; then
      info "No crashes found on device."
      exit 0
    fi
    info "Copying back ${crash_count} crashes."
    crashes="${unique_crashes}"
    local filesfrom="${TMP}/filesfrom"
    FLAGS_ARGV=""
    for crash in ${crashes}; do
      echo "${crash}" >> "${filesfrom}"
      FLAGS_ARGV="${FLAGS_ARGV} '${TMP}/$(basename ${crash})'"
    done
    remote_rsync_from "${filesfrom}" "${TMP}"
    if [ ${FLAGS_clean} -eq ${FLAGS_TRUE} ]; then
      remote_sh "rm -rf ${remote_crash_dirs}"
    fi
  else
    [ -n "${FLAGS_ARGV}" ] || usage
    [ -n "${FLAGS_board}" ] || die "--board is required."
  fi

  local modules_file="${TMP}/modules"
  for dump in ${FLAGS_ARGV}; do
    dump=$(remove_quotes "${dump}")
    if [ $(get_kind "${dump}") == "minidump" ]; then
      # Find all DSOs and executables listed in lines like:
      #  (code_file)       = "/usr/lib/mylib.so"
      ${MINIDUMP_DUMP} "${dump}" 2>/dev/null \
        | grep code_file \
        | sed 's/.*= "\(.*\)"/\1/' \
        >> "${modules_file}"
    fi
  done

  if [ -z "${FLAGS_breakpad_root}" ]; then
    generate_symbols "${modules_file}"
    FLAGS_breakpad_root=/build/${FLAGS_board}/usr/lib/debug/breakpad
  fi

  for dump in ${FLAGS_ARGV}; do
    dump=$(remove_quotes "${dump}")
    if [ $(get_kind "${dump}") = "minidump" ]; then
      info "Dumping stack for $(basename ${dump}) with ${FLAGS_breakpad_root}:"
      ${MINIDUMP_STACKWALK} "${dump}" "${FLAGS_breakpad_root}" 2> /dev/null
    else
      info "Dumping kcrash $(basename ${dump}):"
      cat "${dump}"
    fi
    echo ""
  done
}

main "$@"
