Commit | Line | Data |
---|---|---|
627bf7c1 EZ |
1 | #!/bin/sh |
2 | ||
618f726f | 3 | # Copyright (C) 2003-2016 Free Software Foundation, Inc. |
627bf7c1 EZ |
4 | |
5 | # This program is free software; you can redistribute it and/or modify | |
6 | # it under the terms of the GNU General Public License as published by | |
50efebf8 | 7 | # the Free Software Foundation; either version 3 of the License, or |
627bf7c1 | 8 | # (at your option) any later version. |
50efebf8 | 9 | # |
627bf7c1 EZ |
10 | # This program is distributed in the hope that it will be useful, |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
50efebf8 | 14 | # |
627bf7c1 | 15 | # You should have received a copy of the GNU General Public License |
50efebf8 | 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
627bf7c1 | 17 | |
627bf7c1 | 18 | # |
627bf7c1 EZ |
19 | # Script to generate a core file of a running program. |
20 | # It starts up gdb, attaches to the given PID and invokes the gcore command. | |
21 | # | |
22 | ||
23 | if [ "$#" -eq "0" ] | |
24 | then | |
b292c783 | 25 | echo "usage: @GCORE_TRANSFORM_NAME@ [-o filename] pid" |
627bf7c1 EZ |
26 | exit 2 |
27 | fi | |
28 | ||
29 | # Need to check for -o option, but set default basename to "core". | |
30 | name=core | |
31 | ||
32 | if [ "$1" = "-o" ] | |
33 | then | |
34 | if [ "$#" -lt "3" ] | |
35 | then | |
36 | # Not enough arguments. | |
b292c783 | 37 | echo "usage: @GCORE_TRANSFORM_NAME@ [-o filename] pid" |
627bf7c1 EZ |
38 | exit 2 |
39 | fi | |
40 | name=$2 | |
41 | ||
42 | # Shift over to start of pid list | |
43 | shift; shift | |
44 | fi | |
45 | ||
87326c87 LM |
46 | # Attempt to fetch the absolute path to the gcore script that was |
47 | # called. | |
48 | binary_path=`dirname "$0"` | |
49 | ||
50 | if test "x$binary_path" = x. ; then | |
51 | # We got "." back as a path. This means the user executed | |
52 | # the gcore script locally (i.e. ./gcore) or called the | |
53 | # script via a shell interpreter (i.e. sh gcore). | |
54 | binary_basename=`basename "$0"` | |
55 | ||
56 | # If the gcore script was called like "sh gcore" and the script | |
57 | # lives in the current directory, "which" will not give us "gcore". | |
58 | # So first we check if the script is in the current directory | |
59 | # before using the output of "which". | |
60 | if test -f "$binary_basename" ; then | |
61 | # We have a local gcore script in ".". This covers the case of | |
62 | # doing "./gcore" or "sh gcore". | |
63 | binary_path="." | |
64 | else | |
65 | # The gcore script was not found in ".", which means the script | |
66 | # was called from somewhere else in $PATH by "sh gcore". | |
67 | # Extract the correct path now. | |
68 | binary_path_from_env=`which "$0"` | |
69 | binary_path=`dirname "$binary_path_from_env"` | |
70 | fi | |
71 | fi | |
72 | ||
73 | # Check if the GDB binary is in the expected path. If not, just | |
74 | # quit with a message. | |
75 | if [ ! -f "$binary_path"/@GDB_TRANSFORM_NAME@ ]; then | |
76 | echo "gcore: GDB binary (${binary_path}/@GDB_TRANSFORM_NAME@) not found" | |
77 | exit 1 | |
78 | fi | |
79 | ||
627bf7c1 EZ |
80 | # Initialise return code. |
81 | rc=0 | |
82 | ||
83 | # Loop through pids | |
84 | for pid in $* | |
85 | do | |
3a674486 JK |
86 | # `</dev/null' to avoid touching interactive terminal if it is |
87 | # available but not accessible as GDB would get stopped on SIGTTIN. | |
87326c87 | 88 | $binary_path/@GDB_TRANSFORM_NAME@ </dev/null --nx --batch \ |
3a674486 JK |
89 | -ex "set pagination off" -ex "set height 0" -ex "set width 0" \ |
90 | -ex "attach $pid" -ex "gcore $name.$pid" -ex detach -ex quit | |
dfb893af | 91 | |
627bf7c1 EZ |
92 | if [ -r $name.$pid ] ; then |
93 | rc=0 | |
94 | else | |
b292c783 | 95 | echo "@GCORE_TRANSFORM_NAME@: failed to create $name.$pid" |
627bf7c1 EZ |
96 | rc=1 |
97 | break | |
98 | fi | |
99 | ||
100 | ||
101 | done | |
102 | ||
103 | exit $rc |