summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-06 14:06:54 -0200
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-12-06 14:06:54 -0200
commit678e8dfdc377e304bbe8e0617de1442a04a8c873 (patch)
tree0bded23527e6fdea913408621ff73ac6213fad37
parent83425483569bb63528e0616f36006f6ec2cb14fe (diff)
downloadefl-678e8dfdc377e304bbe8e0617de1442a04a8c873.tar.gz
eo_debug: add lifecycle debug options, allow run-in-tree and use eina_btlog.
As usual with our code, EFL_RUN_IN_TREE=1 will lead to usage of binaries from the current build dir instead of system. To make user life easier, add -l/--lifecycle-debug and -L/--lifecycle-no-debug options, as well as -h/--help. The lifecycle-debug option will export the correct environment variables, such as EO_LIFECYCLE_DEBUG, EO_LIFECYCLE_NO_DEBUG and EINA_LOG_LEVELS=eo_lifecycle:4 if no such level was set for that domain. Last but not least, pass all command's stderr thru eina_btlog so backtraces are automatically translated to function names, files and lines. This one was a bit trickier to respect colors and stdout/stderr contents, see comments in the script.
-rw-r--r--src/scripts/eo/eo_debug.in93
1 files changed, 91 insertions, 2 deletions
diff --git a/src/scripts/eo/eo_debug.in b/src/scripts/eo/eo_debug.in
index a289efa6ad..587bcad535 100644
--- a/src/scripts/eo/eo_debug.in
+++ b/src/scripts/eo/eo_debug.in
@@ -1,9 +1,98 @@
#!/bin/sh
prefix="@prefix@"
exec_prefix="@exec_prefix@"
+
+check_args=1
+while [ $# -ge 1 -a $check_args -eq 1 ]; do
+ case "$1" in
+ -l*|--lifecycle-debug*)
+ ARG="$1"
+ shift
+ CLASSES=`echo "$ARG" | cut -d= -f2`
+ if [ "$CLASSES" = "$ARG" -o -z "$CLASSES" ]; then
+ CLASSES=1
+ fi
+ export EO_LIFECYCLE_DEBUG=$CLASSES
+ ;;
+
+ -L*|--lifecycle-no-debug*)
+ ARG="$1"
+ shift
+ CLASSES=`echo "$ARG" | cut -d= -f2`
+ if [ "$CLASSES" = "$ARG" -o -z "$CLASSES" ]; then
+ echo "ERROR: missing option parameter (Classes to avoid lifecycle debug)" >&2
+ exit 1
+ fi
+ export EO_LIFECYCLE_NO_DEBUG=$CLASSES
+ ;;
+
+ -h|--help)
+ echo "Usage:"
+ echo
+ echo " $0 [options] <executable> [executable parameters]"
+ echo
+ echo "Options:"
+ echo " -l, --lifecycle-debug[=class1,class2] Turn on debug for object "
+ echo " lifecycle, optionally provides "
+ echo " a whitelist of classes to be allowed."
+ echo " -L, --lifecycle-no-debug=class1,class2 Disable lifecycle for the"
+ echo " selected classes."
+ echo " -h, --help This message."
+ exit 0
+ ;;
+
+ *)
+ check_args=0
+ break
+ esac
+done
+
if [ $# -lt 1 ]
then
- echo "Usage: $0 <executable> [executable parameters]"
+ echo "Usage: $0 [options] <executable> [executable parameters]" >&2
+ exit 1
+fi
+
+if [ -z "${EFL_RUN_IN_TREE}" ]; then
+ export LD_PRELOAD="@libdir@/libeo_dbg.so"
+ btlog_bin=eina_btlog
+else
+ bd=$PWD
+ while [ ! -d "${bd}/src/lib/eo/.libs" ]; do
+ bd=`dirname "$bd"`
+ if [ $bd = / ]; then
+ echo "ERROR: EFL_RUN_IN_TREE must be used from inside EFL build tree" >&2
+ exit 1
+ fi
+ done
+ export LD_PRELOAD="$bd/src/lib/eo/.libs/libeo_dbg.so"
+ btlog_bin="$bd/src/bin/eina/eina_btlog"
+fi
+
+if [ "${EINA_LOG_COLOR_DISABLE}" = 1 ]; then
+ btlog_opts="-n"
+elif [ ! -t 1 ]; then
+ btlog_opts="-n"
else
- LD_PRELOAD="@libdir@/libeo_dbg.so" "$@"
+ btlog_opts=""
+ # force color otherwise it will be disabled
+ # since we're using a pipe to eina_btlog
+ export EINA_LOG_COLOR_DISABLE=0
+fi
+
+if [ ! -z "$EO_LIFECYCLE_DEBUG" ]; then
+ if ! echo "$EINA_LOG_LEVELS" | grep "eo_lifecycle:" >/dev/null 2>/dev/null; then
+ export EINA_LOG_LEVELS="eo_lifecycle:4,$EINA_LOG_LEVELS"
+ fi
fi
+
+# 3>&1 1>&2 2>&3: swaps stdout and stderr
+#
+# we need it since eina_btlog reads from stdin and that's the result
+# of command's stdout.
+#
+# at the end we need it again, since eina_btlog outputs to stdout, and
+# that is supposed to be stderr... while stderr was actually the
+# original command's ($@) stdout!
+
+("$@" 3>&1 1>&2 2>&3 | ${btlog_bin} ${btlog_opts} -c) 3>&1 1>&2 2>&3