summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <knielsen@ymer.(none)>2007-07-07 07:46:17 +0200
committerunknown <knielsen@ymer.(none)>2007-07-07 07:46:17 +0200
commit87e1a302c3bbd0f956883321358da8d1dec0591e (patch)
tree32285961b70624005969288f9d547f4d126db07f
parentb1dce946cc87620b2c9b522585e3150ffd981a12 (diff)
downloadmariadb-git-87e1a302c3bbd0f956883321358da8d1dec0591e.tar.gz
Bug #29543 GCov information not written in case of crash.
For GCov builds, if the server crashes, the normal exit handler for writing coverage information is not executed due to the abnormal termination. Fix this by explicitly calling the __gcov_flush function in our crash handler.
-rwxr-xr-xBUILD/compile-pentium-gcov5
-rw-r--r--sql/stacktrace.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/BUILD/compile-pentium-gcov b/BUILD/compile-pentium-gcov
index 26475824570..0d561d5b147 100755
--- a/BUILD/compile-pentium-gcov
+++ b/BUILD/compile-pentium-gcov
@@ -13,8 +13,9 @@ export LDFLAGS="-fprofile-arcs -ftest-coverage"
# The -fprofile-arcs and -ftest-coverage options cause GCC to instrument the
# code with profiling information used by gcov.
-# the -DDISABLE_TAO_ASM is needed to avoid build failures in Yassl.
-extra_flags="$pentium_cflags -fprofile-arcs -ftest-coverage -DDISABLE_TAO_ASM $debug_cflags $max_cflags -DMYSQL_SERVER_SUFFIX=-gcov"
+# The -DDISABLE_TAO_ASM is needed to avoid build failures in Yassl.
+# The -DHAVE_gcov enables code to write out coverage info even when crashing.
+extra_flags="$pentium_cflags -fprofile-arcs -ftest-coverage -DDISABLE_TAO_ASM $debug_cflags $max_cflags -DMYSQL_SERVER_SUFFIX=-gcov -DHAVE_gcov"
c_warnings="$c_warnings $debug_extra_warnings"
cxx_warnings="$cxx_warnings $debug_extra_warnings"
extra_configs="$pentium_configs $debug_configs --disable-shared $static_link"
diff --git a/sql/stacktrace.c b/sql/stacktrace.c
index d8e9b7fd883..c947beafac3 100644
--- a/sql/stacktrace.c
+++ b/sql/stacktrace.c
@@ -241,6 +241,15 @@ void write_core(int sig)
void write_core(int sig)
{
signal(sig, SIG_DFL);
+#ifdef HAVE_gcov
+ /*
+ For GCOV build, crashing will prevent the writing of code coverage
+ information from this process, causing gcov output to be incomplete.
+ So we force the writing of coverage information here before terminating.
+ */
+ extern void __gcov_flush(void);
+ __gcov_flush();
+#endif
pthread_kill(pthread_self(), sig);
#if defined(P_MYID) && !defined(SCO)
/* On Solaris, the above kill is not enough */