diff --git a/scripts/travis/travis-tests b/scripts/travis/travis-tests index c80a3f26c..af95cf0b3 100755 --- a/scripts/travis/travis-tests +++ b/scripts/travis/travis-tests @@ -1,10 +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 +apt-get install -qq protobuf-c-compiler libprotobuf-c0-dev libaio-dev \ + libprotobuf-dev protobuf-compiler python-ipaddr libcap-dev \ + libnl-3-dev 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 000000000..34f25b474 --- /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 68af92954..3b3f6eb04 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) +prev_crash_reports = set(glob.glob("/tmp/zdtm-core-*.txt")) + + +def check_core_files(): + reports = set(glob.glob("/tmp/zdtm-core-*.txt")) - prev_crash_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] @@ -1300,6 +1320,8 @@ class launcher: def finish(self): self.__wait_all() + if not opts['fault'] and check_core_files(): + self.__fail = True if self.__file_report: self.__file_report.close() if self.__fail: