X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgcore.in;h=f47efbe37e3de8430e54a0dacd691901531e060b;hb=fcf23d5b654b0fc05e99c445ebd471221a290cf4;hp=9c5b14df744e525037654d8e2ceea0d6800606a9;hpb=b292c7831823605b02a564b0a9274f95141c92ee;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gcore.in b/gdb/gcore.in index 9c5b14df74..f47efbe37e 100644 --- a/gdb/gcore.in +++ b/gdb/gcore.in @@ -1,6 +1,6 @@ -#!/bin/sh +#!/usr/bin/env bash -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2020 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,45 +20,93 @@ # It starts up gdb, attaches to the given PID and invokes the gcore command. # +# Need to check for -o option, but set default basename to "core". +prefix=core + +# When the -a option is present, this may hold additional commands +# to ensure gdb dumps all mappings (OS dependent). +dump_all_cmds=() + +while getopts :ao: opt; do + case "$opt" in + a) + case "$OSTYPE" in + linux*) + dump_all_cmds=("-ex" "set use-coredump-filter off") + dump_all_cmds+=("-ex" "set dump-excluded-mappings on") + ;; + esac + ;; + o) + prefix=$OPTARG + ;; + *) + echo "usage: @GCORE_TRANSFORM_NAME@ [-a] [-o prefix] pid1 [pid2...pidN]" + exit 2 + ;; + esac +done + +shift $((OPTIND-1)) + if [ "$#" -eq "0" ] then - echo "usage: @GCORE_TRANSFORM_NAME@ [-o filename] pid" + echo "usage: @GCORE_TRANSFORM_NAME@ [-a] [-o prefix] pid1 [pid2...pidN]" exit 2 fi -# Need to check for -o option, but set default basename to "core". -name=core +# Attempt to fetch the absolute path to the gcore script that was +# called. +binary_path=`dirname "$0"` -if [ "$1" = "-o" ] -then - if [ "$#" -lt "3" ] - then - # Not enough arguments. - echo "usage: @GCORE_TRANSFORM_NAME@ [-o filename] pid" - exit 2 - fi - name=$2 - - # Shift over to start of pid list - shift; shift +if test "x$binary_path" = x. ; then + # We got "." back as a path. This means the user executed + # the gcore script locally (i.e. ./gcore) or called the + # script via a shell interpreter (i.e. sh gcore). + binary_basename=`basename "$0"` + + # If the gcore script was called like "sh gcore" and the script + # lives in the current directory, "which" will not give us "gcore". + # So first we check if the script is in the current directory + # before using the output of "which". + if test -f "$binary_basename" ; then + # We have a local gcore script in ".". This covers the case of + # doing "./gcore" or "sh gcore". + binary_path="." + else + # The gcore script was not found in ".", which means the script + # was called from somewhere else in $PATH by "sh gcore". + # Extract the correct path now. + binary_path_from_env=`which "$0"` + binary_path=`dirname "$binary_path_from_env"` + fi +fi + +# Check if the GDB binary is in the expected path. If not, just +# quit with a message. +if [ ! -f "$binary_path/@GDB_TRANSFORM_NAME@" ]; then + echo "gcore: GDB binary (${binary_path}/@GDB_TRANSFORM_NAME@) not found" + exit 1 fi # Initialise return code. rc=0 # Loop through pids -for pid in $* +for pid in "$@" do # `