barbieri pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=678e8dfdc377e304bbe8e0617de1442a04a8c873
commit 678e8dfdc377e304bbe8e0617de1442a04a8c873 Author: Gustavo Sverzut Barbieri <barbi...@profusion.mobi> Date: Tue Dec 6 14:06:54 2016 -0200 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. --- src/scripts/eo/eo_debug.in | 93 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/src/scripts/eo/eo_debug.in b/src/scripts/eo/eo_debug.in index a289efa..587bcad 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 --