diff --git a/Jenkinsfile b/Jenkinsfile index 5e91075dba..6bbe501cdd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -300,6 +300,12 @@ pipeline { } sh 'make distclean' } + post { + failure { + sh('find . -name core') + sh('gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" build/posix_sitl_default/px4 core') + } + } } stage('check stack') { diff --git a/platforms/posix/src/main.cpp b/platforms/posix/src/main.cpp index d0b19233a7..790d8f4947 100644 --- a/platforms/posix/src/main.cpp +++ b/platforms/posix/src/main.cpp @@ -83,6 +83,7 @@ extern "C" { cout.flush(); _ExitFlag = true; } + void _SigFpeHandler(int sig_num); void _SigFpeHandler(int sig_num) { @@ -91,6 +92,15 @@ extern "C" { PX4_BACKTRACE(); cout.flush(); } + + void _SigSegvHandler(int sig_num); + void _SigSegvHandler(int sig_num) + { + cout.flush(); + cout << endl << "segmentation fault" << endl; + PX4_BACKTRACE(); + cout.flush(); + } } static inline bool fileExists(const string &name) @@ -299,20 +309,24 @@ int main(int argc, char **argv) tcgetattr(0, &orig_term); atexit(restore_term); - struct sigaction sig_int; - memset(&sig_int, 0, sizeof(struct sigaction)); + // SIGINT + struct sigaction sig_int {}; sig_int.sa_handler = _SigIntHandler; sig_int.sa_flags = 0;// not SA_RESTART!; + sigaction(SIGINT, &sig_int, nullptr); - struct sigaction sig_fpe; - memset(&sig_fpe, 0, sizeof(struct sigaction)); + // SIGFPE + struct sigaction sig_fpe {}; sig_fpe.sa_handler = _SigFpeHandler; sig_fpe.sa_flags = 0;// not SA_RESTART!; - - sigaction(SIGINT, &sig_int, nullptr); - //sigaction(SIGTERM, &sig_int, NULL); sigaction(SIGFPE, &sig_fpe, nullptr); + // SIGSEGV + struct sigaction sig_segv {}; + sig_segv.sa_handler = _SigSegvHandler; + sig_segv.sa_flags = SA_RESTART | SA_SIGINFO; + sigaction(SIGSEGV, &sig_segv, nullptr); + set_cpu_scaling(); int index = 1;