[Asterisk-code-review] ast coredumper: Minor fixes (asterisk[certified/13.18])

George Joseph asteriskteam at digium.com
Fri Feb 23 15:03:16 CST 2018


George Joseph has uploaded this change for review. ( https://gerrit.asterisk.org/8388


Change subject: ast_coredumper:  Minor fixes
......................................................................

ast_coredumper:  Minor fixes

* Fix --tarball-config so the option doesn't cause an error.

* Allow for missing /etc/os-release.

* Add a sleep between tarballing the coredump and removing the
  output directory to allow the filesystem to settle.

Change-Id: I73e03b13087978bcc7f6bc9f45753990f82d9d77
---
M contrib/scripts/ast_coredumper
1 file changed, 131 insertions(+), 38 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/88/8388/1

diff --git a/contrib/scripts/ast_coredumper b/contrib/scripts/ast_coredumper
index 81e94e9..38d95cc 100755
--- a/contrib/scripts/ast_coredumper
+++ b/contrib/scripts/ast_coredumper
@@ -15,8 +15,9 @@
 	$prog [ --help ] [ --running | --RUNNING ] [ --latest ]
 		[ --tarball-coredumps ] [ --delete-coredumps-after ]
 		[ --tarball-results ] [ --delete-results-after ]
-		[ --tarball-uniqueid="<uniqueid>" ]
+		[ --tarball-config ] [ --tarball-uniqueid="<uniqueid>" ]
 		[ --no-default-search ] [ --append-coredumps ]
+		[ --asterisk-bin="path" ]
 		[ <coredump> | <pattern> ... ]
 
 DESCRIPTION
@@ -50,7 +51,8 @@
 		Create a coredump from the running asterisk instance and
 		process it along with any other coredumps found (if any).
 		WARNING: This WILL interrupt call processing.  You will be
-		asked to confirm.
+		asked to confirm.  The coredump will be written to /tmp if
+		$OUTPUTDIR is not defined.
 
 	--RUNNING
 		Same as --running but without the confirmation prompt.
@@ -63,9 +65,16 @@
 		from the existing coredumps.
 
 	--tarball-coredumps
-		Creates a gzipped tarball of all coredumps processed.
-		The tarball name will be:
-		/tmp/asterisk.<timestamp>.coredumps.tar.gz
+		Creates a gzipped tarball of coredumps processed, their
+		results txt files and copies of /etc/os-release,
+		/usr/sbin/asterisk, /usr/lib(64)/libasterisk* and
+		/usr/lib(64)/asterisk as those files are needed to properly
+		examine the coredump.  The file will be named
+		$OUTPUTDIR/asterisk.<timestamp>.coredumps.tar.gz or
+		$OUTPUTDIR/asterisk-<uniqueid>.coredumps.tar.gz if
+		--tarball-uniqueid was specified.
+		WARNING:  This file could 1gb in size!
+		Mutually exclusive with --tartball-results
 
 	--delete-coredumps-after
 		Deletes all processed coredumps regardless of whether
@@ -74,13 +83,18 @@
 	--tarball-results
 		Creates a gzipped tarball of all result files produced.
 		The tarball name will be:
-		/tmp/asterisk.<timestamp>.results.tar.gz
+		$OUTPUTDIR/asterisk.<timestamp>.results.tar.gz
+		Mutually exclusive with --tartball-coredumps
 
 	--delete-results-after
 		Deletes all processed results regardless of whether
 		a tarball was created.  It probably doesn't make sense
 		to use this option unless you have also specified
 		--tarball-results.
+
+	--tarball-config
+		Adds the contents of /etc/asterisk to the tarball created
+		with --tarball-coredumps or --tarball-results.
 
 	--tarball-uniqueid="<uniqueid>"
 		Normally DATEFORMAT is used to make the tarballs unique
@@ -95,6 +109,10 @@
 	--append-coredumps
 		Append any coredumps specified on the command line to the
 		config file specified ones instead of overriding them.
+
+	--asterisk-binary
+		Path to the asterisk binary. Default: look for asterisk
+		in the PATH.
 
 	<coredump> | <pattern>
 		A list of coredumps or coredump search patterns.  Unless
@@ -118,6 +136,10 @@
 
 NOTES
 	You must be root to use $prog.
+
+	$OUTPUTDIR can be read from the current environment or from the
+	ast_debug_tools.conf file described below.  If not specified,
+	work products are placed in the same directory as the core file.
 
 	The script relies on not only bash, but also recent GNU date and
 	gdb with python support.  *BSD operating systems may require
@@ -155,6 +177,12 @@
 	# anyway.
 	COREDUMPS=(/tmp/core[-._]asterisk!(*.txt) /tmp/core[-._]\$(hostname)!(*.txt))
 
+	# The directory to contain output files and work directories.
+	# For output from existing core files, the default is the
+	# directory that the core file is found in.  For core files
+	# produced from a running process, the default is /tmp.
+	OUTPUTDIR=/some/directory
+
 	# Date command for the "running" coredump and tarballs.
 	# DATEFORMAT will be executed to get the timestamp.
 	# Don't put quotes around the format string or they'll be
@@ -188,6 +216,7 @@
 RUNNING=false
 latest=false
 tarball_coredumps=false
+tarball_config=false
 delete_coredumps_after=false
 tarball_results=false
 delete_results_after=false
@@ -214,6 +243,13 @@
 if [ -z "$GDB" ] ; then
 	echo "No suitable gdb was found in $PATH"
 	exit 1
+fi
+
+if [ -n "$OUTPUTDIR" ] ; then
+	if [ ! -d "$OUTPUTDIR" ] ; then
+		echo "OUTPUTDIR $OUTPUTDIR doesn't exists or is not a directory"
+		exit 1
+	fi
 fi
 
 if [ ${#COREDUMPS[@]} -eq 0 ] ; then
@@ -246,6 +282,9 @@
 	--tarball-coredumps)
 		tarball_coredumps=true
 		;;
+	--tarball-config)
+		tarball_config=true
+		;;
 	--delete-coredumps-after)
 		delete_coredumps_after=true
 		;;
@@ -260,6 +299,9 @@
 		;;
 	--tarball-uniqueid=*)
 		tarball_uniqueid=${a#*=}
+		;;
+	--asterisk-bin=*)
+		asterisk_bin=${a#*=}
 		;;
 	--help|-*)
 		print_help
@@ -312,6 +354,10 @@
 # Timestamp to use for output files
 df=${tarball_uniqueid:-$(${DATEFORMAT})}
 
+if [ -z "$asterisk_bin" ]; then
+	asterisk_bin=$(which asterisk)
+fi
+
 if $running || $RUNNING ; then
 	# We need to go through some gyrations to find the pid of the running
 	# MAIN asterisk process and not someone or something running asterisk -r.
@@ -337,9 +383,9 @@
 			read -p "WARNING:  Taking a core dump of the running asterisk instance will suspend call processing while the dump is saved.  Do you wish to continue? (y/N) " answer
 		fi
 		if [[ "$answer" =~ ^[Yy] ]] ; then
-			cf="/tmp/core-asterisk-running-$df"
+			cf="${OUTPUTDIR:-/tmp}/core-asterisk-running-$df"
 			echo "Dumping running asterisk process to $cf"
-			${GDB} -p $pid -q --batch --ex "gcore $cf" >/dev/null 2>&1
+			${GDB} ${asterisk_bin} -p $pid -q --batch --ex "gcore $cf" >/dev/null 2>&1
 			COREDUMPS+=("$cf")
 		else
 			echo "Skipping dump of running process"
@@ -356,17 +402,22 @@
 # and save them to /tmp/.gdbinit
 
 ss=`egrep -n "^#@@@SCRIPTSTART@@@" $0 |cut -f1 -d:`
-tail -n +${ss} $0 >/tmp/.ast_coredumper.gdbinit
+tail -n +${ss} $0 >${OUTPUTDIR:-/tmp}/.ast_coredumper.gdbinit
 
 # Now iterate over the coredumps and dump the debugging info
 for i in ${!COREDUMPS[@]} ; do
 	cf=${COREDUMPS[$i]}
 	echo "Processing $cf"
-	${GDB} -n --batch -q --ex "source /tmp/.ast_coredumper.gdbinit" $(which asterisk) "$cf" 2>/dev/null | (
+
+	cfdir=`dirname ${cf}`
+	cfname=`basename ${cf}`
+	outputdir=${OUTPUTDIR:-${cfdir}}
+
+	${GDB} -n --batch -q --ex "source ${OUTPUTDIR:-/tmp}/.ast_coredumper.gdbinit" "$asterisk_bin" "$cf" 2>/dev/null | (
 		of=/dev/null
 		while IFS= read line ; do
 			if [[ "$line" =~ !@!@!@!\ ([^\ ]+)\ !@!@!@! ]] ; then
-				of=${cf}-${BASH_REMATCH[1]}
+				of=${outputdir}/${cfname}-${BASH_REMATCH[1]}
 				of=${of//:/-}
 				rm -f "$of"
 				echo "Creating $of"
@@ -374,37 +425,59 @@
 			echo -e $"$line" >> "$of"
 		done
 	)
-done
 
-if $tarball_coredumps ; then
-	tf=/tmp/asterisk-$df.coredumps.tar
-	echo "Creating $tf.gz"
-	for i in ${!COREDUMPS[@]} ; do
-		tar -uvf $tf "${COREDUMPS[@]}" 2>/dev/null
-	done
-	gzip $tf
-fi
+	if $tarball_coredumps ; then
+		cfname=${cfname//:/-}
+		tf=${outputdir}/${cfname}.tar.gz
+		echo "Creating ${tf}"
+
+		dest=${outputdir}/${cfname}.output
+		rm -rf ${dest} 2>/dev/null || :
+
+		libdir=usr/lib
+		[ -d /usr/lib64 ] && libdir+=64
+		mkdir -p ${dest}/tmp ${dest}/${libdir}/asterisk ${dest}/etc ${dest}/usr/sbin
+
+		ln -s ${cf} ${dest}/tmp/${cfname}
+		cp ${outputdir}/${cfname}*.txt ${dest}/tmp/
+		[ -f /etc/os-release ] && cp /etc/os-release ${dest}/etc/
+		if $tarball_config ; then
+			cp -a /etc/asterisk ${dest}/etc/
+		fi
+		cp -a /${libdir}/libasterisk* ${dest}/${libdir}/
+		cp -a /${libdir}/asterisk/* ${dest}/${libdir}/asterisk/
+		cp -a /usr/sbin/asterisk ${dest}/usr/sbin
+		rm -rf ${tf}
+		tar -chzf ${tf} --transform="s/^[.]/${cfname}/" -C ${dest} .
+		sleep 3
+		rm -rf ${dest}
+		echo "Created $tf"
+	elif $tarball_results ; then
+		cfname=${cfname//:/-}
+		tf=${outputdir}/${cfname}.tar.gz
+		echo "Creating ${tf}"
+
+		dest=${outputdir}/${cfname}.output
+		rm -rf ${dest} 2>/dev/null || :
+		mkdir -p ${dest}
+		cp ${outputdir}/${cfname}*.txt ${dest}/
+		if $tarball_config ; then
+			mkdir -p ${dest}/etc
+			cp -a /etc/asterisk ${dest}/etc/
+		fi
+		tar -chzf ${tf} --transform="s/^[.]/${cfname}/" -C ${dest} .
+		rm -rf ${dest}
+		echo "Created $tf"
+	fi
 
 if $delete_coredumps_after ; then
-	for i in ${!COREDUMPS[@]} ; do
-		rm -rf "${COREDUMPS[$i]}"
-	done
-fi
+		rm -rf "${cf}"
+	fi
 
-if $tarball_results ; then
-	tf=/tmp/asterisk-$df-results.tar
-	echo "Creating $tf.gz"
-	for i in ${!COREDUMPS[@]} ; do
-		tar -uvf $tf "${COREDUMPS[$i]//:/-}"-{brief,full,thread1,locks}.txt 2>/dev/null
-	done
-	gzip $tf
-fi
-
-if $delete_results_after ; then
-	for i in ${!COREDUMPS[@]} ; do
-		rm -rf "${COREDUMPS[$i]//:/-}"-{brief,full,thread1,locks}.txt
-	done
-fi
+	if $delete_results_after ; then
+		rm -rf "${cf//:/-}"-{brief,full,thread1,locks}.txt
+	fi
+done
 
 exit
 
@@ -431,21 +504,41 @@
             pass
         print("!@!@!@! thread1.txt !@!@!@!\n")
         try:
+            gdb.execute("p $_siginfo", from_tty)
+            gdb.execute("info signal $_siginfo.si_signo")
+        except:
+            pass
+        try:
             gdb.execute("thread apply 1 bt full", from_tty)
         except:
             pass
         print("!@!@!@! brief.txt !@!@!@!\n")
+        try:
+            gdb.execute("p $_siginfo", from_tty)
+            gdb.execute("info signal $_siginfo.si_signo")
+        except:
+            pass
         try:
             gdb.execute("thread apply all bt", from_tty)
         except:
             pass
         print("!@!@!@! full.txt !@!@!@!\n")
         try:
+            gdb.execute("p $_siginfo", from_tty)
+            gdb.execute("info signal $_siginfo.si_signo")
+        except:
+            pass
+        try:
             gdb.execute("thread apply all bt full", from_tty)
         except:
             pass
         print("!@!@!@! locks.txt !@!@!@!\n")
         try:
+            gdb.execute("p $_siginfo", from_tty)
+            gdb.execute("info signal $_siginfo.si_signo")
+        except:
+            pass
+        try:
             gdb.execute("show_locks", from_tty)
         except:
             pass

-- 
To view, visit https://gerrit.asterisk.org/8388
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: certified/13.18
Gerrit-MessageType: newchange
Gerrit-Change-Id: I73e03b13087978bcc7f6bc9f45753990f82d9d77
Gerrit-Change-Number: 8388
Gerrit-PatchSet: 1
Gerrit-Owner: George Joseph <gjoseph at digium.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20180223/a44b0564/attachment-0001.html>


More information about the asterisk-code-review mailing list