| #!/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 upload all debug symbols required for crash reporting |
| # purposes. This script need only be used to upload release builds |
| # symbols or to debug crashes on non-release builds (in which case try |
| # to only upload the symbols for those executables involved). |
| |
| # --- 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 must be run inside the chroot |
| restart_in_chroot_if_needed "$@" |
| |
| get_default_board |
| |
| # Flags |
| DEFINE_string board "$DEFAULT_BOARD" "The board to build packages for." |
| DEFINE_string breakpad_root "" "Root directory for breakpad symbols." |
| DEFINE_boolean official_build ${FLAGS_FALSE} "Point to official symbol server." |
| DEFINE_boolean regenerate ${FLAGS_FALSE} "Regenerate all symbols." |
| DEFINE_boolean verbose ${FLAGS_FALSE} "Be verbose." |
| DEFINE_boolean yes ${FLAGS_FALSE} "Answer yes to all prompts." |
| |
| SYM_UPLOAD="sym_upload" |
| |
| ANY_ERRORS=0 |
| |
| OUT_DIR=$(mktemp -d "/tmp/err.XXXX") |
| |
| function cleanup() { |
| rm -rf "${OUT_DIR}" |
| } |
| |
| function really_upload() { |
| if [ ${FLAGS_yes} -eq ${FLAGS_TRUE} ]; then |
| return 0 |
| fi |
| echo "Uploading symbols for an entire Chromium OS build is really only " |
| echo "necessary for release builds and in a few cases for developers " |
| echo "to debug problems. It will take considerable time to run. For " |
| echo "developer debugging purposes, consider instead passing specific files " |
| echo "to upload." |
| read -p "Are you sure you want to upload all build symbols (y/N)? " SURE |
| SURE="${SURE:0:1}" # Get just the first character |
| if [ "${SURE}" != "y" ]; then |
| echo "Ok, better safe than sorry." |
| return 1 |
| fi |
| return 0 |
| } |
| |
| # Upload the given symbol file to given URL. |
| function upload_file() { |
| local upload_file="$1" |
| local upload_url="$2" |
| if [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]; then |
| info "Uploading ${upload_file}" |
| fi |
| "${SYM_UPLOAD}" "${upload_file}" "${upload_url}" > "${OUT_DIR}/stdout" \ |
| 2> "${OUT_DIR}/stderr" |
| if ! grep -q "Successfully sent the symbol file." "${OUT_DIR}/stdout"; then |
| error "Unable to upload symbols in ${upload_file}:" |
| cat "${OUT_DIR}/stderr" |
| ANY_ERRORS=1 |
| return 1 |
| fi |
| if [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]; then |
| size=$(wc -c "${upload_file}" | cut -d' ' -f1) |
| info "Successfully uploaded ${size}B." |
| fi |
| return 0 |
| } |
| |
| function main() { |
| trap cleanup EXIT |
| |
| # Parse command line |
| FLAGS_HELP="usage: $0 [flags] [<files...>]" |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| set -e |
| |
| [ -n "$FLAGS_board" ] || die "--board is required." |
| |
| SYSROOT="/build/${FLAGS_board}" |
| |
| local upload_url="" |
| if [ $FLAGS_official_build -eq $FLAGS_TRUE ]; then |
| upload_url="http://clients2.google.com/cr/symbol" |
| else |
| upload_url="http://clients2.google.com/cr/staging_symbol" |
| warn "This is an unofficial build, uploading to staging server." |
| fi |
| info "Uploading symbols to ${upload_url} from ${SYSROOT}." |
| |
| DEFAULT_BREAKPAD_ROOT="${SYSROOT}/usr/lib/debug/breakpad" |
| if [ -z "${FLAGS_breakpad_root}" ]; then |
| FLAGS_breakpad_root="${DEFAULT_BREAKPAD_ROOT}" |
| else |
| if [ ${FLAGS_regenerate} -eq ${FLAGS_TRUE} ]; then |
| warn "Assuming --noregenerate when --breakpad_root is specified" |
| FLAGS_regenerate=${FLAGS_FALSE} |
| fi |
| fi |
| |
| if [ -z "${FLAGS_ARGV}" ]; then |
| if [ ${FLAGS_regenerate} -eq ${FLAGS_TRUE} ]; then |
| really_upload || exit 1 |
| info "Clearing ${DEFAULT_BREAKPAD_ROOT}" |
| sudo rm -rf "${DEFAULT_BREAKPAD_ROOT}" |
| info "Generating all breakpad symbol files." |
| local verbosity="" |
| local generate_script="${SCRIPTS_DIR}/cros_generate_breakpad_symbols" |
| [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ] && verbosity="--verbose" |
| if ! "${generate_script}" --board=${FLAGS_board} ${verbosity}; then |
| error "Some errors while generating symbols; uploading anyway" |
| ANY_ERRORS=1 |
| fi |
| fi |
| |
| info "Uploading all breakpad symbol files." |
| for sym_file in $(find "${FLAGS_breakpad_root}" -name \*.sym); do |
| ! upload_file "${sym_file}" "${upload_url}" |
| done |
| else |
| error "Unexpected args ${FLAGS_ARGV}" |
| fi |
| |
| [ ${ANY_ERRORS} -ne 0 ] && die "Encountered problems" |
| return 0 |
| } |
| |
| main "$@" |