Author: mvidner
Date: Mon Apr 27 15:51:48 2009
New Revision: 56997
URL: http://svn.opensuse.org/viewcvs/yast?rev=56997&view=rev
Log:
Resurrected logging in the signal handler, into
/var/log/YaST2/signal (or ./y2signal.log) (bnc#493152#c33).
Modified:
trunk/core/VERSION
trunk/core/liby2/src/genericfrontend.cc
trunk/core/package/yast2-core.changes
Modified: trunk/core/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/VERSION?rev=56997&r1=56996&r2=56997&view=diff
==============================================================================
--- trunk/core/VERSION (original)
+++ trunk/core/VERSION Mon Apr 27 15:51:48 2009
@@ -1 +1 @@
-2.18.8
+2.18.9
Modified: trunk/core/liby2/src/genericfrontend.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/liby2/src/genericfrontend.cc?rev=56997&r1=56996&r2=56997&view=diff
==============================================================================
--- trunk/core/liby2/src/genericfrontend.cc (original)
+++ trunk/core/liby2/src/genericfrontend.cc Mon Apr 27 15:51:48 2009
@@ -89,9 +89,9 @@
#include
#include
#include
+#include
#include <sstream>
#include <iomanip>
-#include
#include <string>
#include
@@ -123,101 +123,139 @@
static void print_help ();
static void print_error (const char*, ...) __attribute__ ((format (printf, 1, 2)));
static bool has_parens (const char* arg);
-string demangle( const char * mangled );
+
+int signal_log_fd; // fd to use for logging in signal handler
+
+static
+void
+signal_log_to_fd (int fd, const char * cs)
+{
+ ssize_t n = strlen (cs);
+ while (true) {
+ ssize_t w = write(fd, cs, n);
+ if (w == n)
+ break; // success
+ else if (w == -1) {
+ if (errno == EINTR) {
+ // perror("gotcha"); // bnc#470645
+ }
+ else {
+ perror("write"); // other cases
+ break;
+ }
+ }
+ else {
+ errno = 0;
+ cs += w;
+ n -= w;
+ }
+ }
+
+}
+
+static
+void
+signal_log (const char * cs)
+{
+ signal_log_to_fd (signal_log_fd, cs);
+}
static
bool
-log_blanik (const string & s)
+signal_log_ss (const string & s)
{
- y2lograw (s.c_str ());
+ signal_log (s.c_str ());
return true;
}
+
+static
+void
+signal_log_timestamp ()
+{
+ char buffer[200];
+ time_t time_time;
+ struct tm tm_time;
+
+ time_time = time(NULL);
+ localtime_r (&time_time, &tm_time);
+
+ if (strftime(buffer, sizeof(buffer), "=== %F %T %z ===\n", &tm_time) != 0)
+ {
+ signal_log (buffer);
+ }
+}
+
// fate#302166 "cache yast debugging logs in case of failure"
static
-void log_stored_debug ()
+void signal_log_stored_debug ()
{
- y2error ("Liberating suppressed debugging messages:");
- blanik.for_each (log_blanik);
- y2error ("End of suppressed debugging messages");
+ signal_log ("Liberating suppressed debugging messages:\n");
+ blanik.for_each (signal_log_ss);
+ signal_log ("End of suppressed debugging messages\n");
}
// FATE 302167, info '(libc) Backtraces'
void
-log_backtrace ()
+signal_log_backtrace ()
{
static const int N = 100;
void *frames[N];
size_t size = backtrace (frames, N);
- char ** strings = backtrace_symbols (frames, size);
+ // demangling is not signal safe
+ signal_log ("Backtrace: (use c++filt to demangle)\n");
+ backtrace_symbols_fd (frames, size, signal_log_fd);
+}
- std::stringstream backtrace;
+void
+signal_log_open ()
+{
+ signal_log_fd = -1;
+
+ const char * logfns[] = {
+ "/var/log/YaST2/signal",
+ "y2signal.log",
+ NULL, // sentinel
+ };
- for (size_t i = 0; i < size; ++i)
+ for (const char ** logfn_p = &logfns[0]; *logfn_p != NULL; ++logfn_p)
{
- backtrace << " Frame "
- << std::setw( 2 ) << i << ": "
- << demangle( strings[i] ) << "\n";
+ signal_log_fd = open (*logfn_p, O_WRONLY | O_CREAT | O_APPEND, 0700);
+ if (signal_log_fd != -1)
+ break;
}
-
- y2error( "Back trace:\n\n%s\n== End of back trace ===\n",
- backtrace.str().c_str() );
-
- free (strings);
}
-
-
-string demangle( const char * mangled )
+void
+signal_handler (int sig)
{
- const char * func_begin = strchr( mangled, '(' );
-
- if ( ! func_begin )
- return string( mangled );
-
- func_begin++; // skip '('
-
- string func( func_begin );
- std::size_t func_end = func.find_first_of( ")+" );
-
- if ( func_end != string::npos )
- func.erase( func_end );
+ signal (sig, SIG_IGN);
- int status = 0;
- char * demangled_name =
- abi::__cxa_demangle( func.c_str(),
- 0, // output buffer
- 0, // length
- & status );
+ // bnc#493152#c19 only signal-safe functions are allowed
+ char buffer[200];
+ int n = snprintf (buffer, sizeof(buffer),
+ "YaST got signal %d at YCP file %s:%d\n",
+ sig, ee.filename ().c_str (), ee.linenumber ());
+ if (n >= (int)sizeof(buffer) || n < 0)
+ strcpy (buffer, "YaST got a signal.\n");
+ signal_log_to_fd (STDERR_FILENO, buffer);
- if ( status == 0 && demangled_name )
+ signal_log_open ();
+ if (signal_log_fd == -1)
{
- func = string( demangled_name );
- free( demangled_name ); // abi::__cxa_demangle uses malloc()
-
- string lib_name = string( mangled, func_begin - mangled -1 );
-
- return lib_name + " " + func;
+ signal_log_to_fd (STDERR_FILENO, "Could not open log file.\n");
}
else
{
- return string( mangled );
- }
-}
+ signal_log_timestamp ();
+ signal_log (buffer);
+ signal_log_stored_debug ();
+ signal_log_backtrace ();
+ if (close (signal_log_fd) == -1)
+ perror ("log close");
+ }
-void
-signal_handler (int sig)
-{
- signal (sig, SIG_IGN);
-/* // bnc#493152#c19 only signal-safe functions are allowed
- fprintf (stderr, "YaST got signal %d at YCP file %s:%d\n",
- sig, ee.filename ().c_str (), ee.linenumber ());
- y2error ("got signal %d at YCP file %s:%d",
- sig, ee.filename ().c_str (), ee.linenumber ());
- log_stored_debug ();
- log_backtrace ();
-*/
// bye
signal (sig, SIG_DFL);
kill ( getpid (), sig);
Modified: trunk/core/package/yast2-core.changes
URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/package/yast2-core.changes?rev=56997&r1=56996&r2=56997&view=diff
==============================================================================
--- trunk/core/package/yast2-core.changes (original)
+++ trunk/core/package/yast2-core.changes Mon Apr 27 15:51:48 2009
@@ -1,7 +1,10 @@
-------------------------------------------------------------------
-Mon Apr 27 13:37:29 CEST 2009 - mvidner@suse.cz
+Mon Apr 27 15:51:11 CEST 2009 - mvidner@suse.cz
+- Resurrected logging in the signal handler, into
+ /var/log/YaST2/signal (or ./y2signal.log) (bnc#493152#c33).
- Y2StdioComponent: exit only at EOF, not on parse error (bnc#498407).
+- 2.18.9
-------------------------------------------------------------------
Fri Apr 24 13:49:29 CEST 2009 - mvidner@suse.cz
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org