[CRIU] [PATCH] travis: catch core dump files in error cases
Pavel Emelyanov
xemul at virtuozzo.com
Tue Aug 23 07:12:19 PDT 2016
On 08/20/2016 03:26 AM, Andrei Vagin wrote:
> From: Andrei Vagin <avagin at virtuozzo.com>
>
> It is very hard to investigate travis fails, when something is segfaulted.
>
> Let's add our own core file handler which will provide all required
> information for us. Now test/abrt.sh shows a process tree,
> process mappings, registers and backtraces.
>
> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
> ---
> scripts/travis/travis-tests | 7 ++++++-
> test/abrt.sh | 30 ++++++++++++++++++++++++++++++
> test/zdtm.py | 22 ++++++++++++++++++++++
> 3 files changed, 58 insertions(+), 1 deletion(-)
> create mode 100755 test/abrt.sh
>
> diff --git a/scripts/travis/travis-tests b/scripts/travis/travis-tests
> index 764dcb1..6976de2 100755
> --- a/scripts/travis/travis-tests
> +++ b/scripts/travis/travis-tests
> @@ -1,12 +1,17 @@
> #!/bin/sh
> set -x -e
>
> +ulimit -c unlimited
> +
> cd ../../
>
> +service apport stop
> +echo "|`pwd`/test/abrt.sh %P %p %s %e" > /proc/sys/kernel/core_pattern
> +
> apt-get update -qq
> apt-get install -qq protobuf-c-compiler libprotobuf-c0-dev libaio-dev \
> libprotobuf-dev protobuf-compiler python-ipaddr libcap-dev \
> - libnl-3-dev gcc-multilib libc6-dev-i386
> + libnl-3-dev gcc-multilib libc6-dev-i386 gdb bash
> chmod a+x $HOME
> export GCOV=1
> make
> diff --git a/test/abrt.sh b/test/abrt.sh
> new file mode 100755
> index 0000000..34f25b4
> --- /dev/null
> +++ b/test/abrt.sh
> @@ -0,0 +1,30 @@
> +#!/bin/bash -x
> +
> +pid=$1
> +vpid=$2
> +sig=$3
> +comm=$4
> +
> +exec &>> /tmp/zdtm-core.log
> +
> +expr match "$comm" zombie00 && {
> + cat > /dev/null
> + exit 0
> +}
> +
> +report="/tmp/zdtm-core-$pid-$comm"
> +exec &> ${report}.txt
> +
> +ps axf
> +ps -p $pid
> +
> +cat /proc/$pid/status
> +ls -l /proc/$pid/fd
> +cat /proc/$pid/maps
> +exec 33< /proc/$pid/exe
> +cat > $report.core
> +
> +echo 'bt
> +i r
> +disassemble $rip-0x10,$rip + 0x10
> +' | gdb -c $report.core /proc/self/fd/33
> diff --git a/test/zdtm.py b/test/zdtm.py
> index 0bd8e3b..1bd38eb 100755
> --- a/test/zdtm.py
> +++ b/test/zdtm.py
> @@ -1,6 +1,7 @@
> #!/usr/bin/env python2
> # vim: noet
> import argparse
> +import glob
> import os
> import subprocess
> import time
> @@ -102,6 +103,25 @@ def add_to_output(path):
> fdo.write(buf)
>
>
> +init_reports = set(glob.glob("/tmp/zdtm-core-*.txt"))
> +
> +
> +def check_core_files():
The whole function only makes sense if --report is turned on, doesn't it?
> + reports = set(glob.glob("/tmp/zdtm-core-*.txt")) - init_reports
Maybe name this cores, not reports?
> + if not reports:
> + return False
> +
> + while subprocess.Popen("ps axf | grep 'abrt\.sh'", shell = True).wait() == 0:
> + time.sleep(1)
> +
> + for i in reports:
> + add_to_report(i, os.path.basename(i))
> + print_sep(i)
> + print open(i).read()
> + print_sep(i)
> +
> + return True
> +
> # Arch we run on
> arch = os.uname()[4]
>
> @@ -1242,6 +1262,8 @@ class launcher:
>
> def finish(self):
> self.__wait_all()
> + if not opts['fault'] and check_core_files():
Why not for faults? Just curious :)
> + self.__fail = True
O_o Can it happen that we have cores, but __fail is not set?
> if self.__file_report:
> self.__file_report.close()
> if self.__fail:
>
More information about the CRIU
mailing list