From: Julian Seward Date: Sat, 15 Nov 2014 10:29:57 +0000 (+0000) Subject: * add a logging mechanism to show repeated messages at exponentially X-Git-Tag: svn/VALGRIND_3_11_0~823 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=548a64bfefe44c9beadf70485eee64d7dfd5041f;p=thirdparty%2Fvalgrind.git * add a logging mechanism to show repeated messages at exponentially declining rates, so as to reduce the amount of junk spewed out by the various support functions for the MacOS syscall wrappers. * add a couple more cases to the resync filter for Yosemite. This is working pretty well now. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14725 --- diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c index 39c8ecdda1..30e6d776df 100644 --- a/coregrind/m_syswrap/syswrap-darwin.c +++ b/coregrind/m_syswrap/syswrap-darwin.c @@ -57,6 +57,7 @@ #include "pub_core_syscall.h" #include "pub_core_syswrap.h" #include "pub_core_tooliface.h" +#include "pub_core_wordfm.h" #include "priv_types_n_macros.h" #include "priv_syswrap-generic.h" /* for decls of generic wrappers */ @@ -329,6 +330,63 @@ void VG_(cleanup_thread) ( ThreadArchState* arch ) } +/* --------------------------------------------------------------------- + Message reporting, with duplicate removal + ------------------------------------------------------------------ */ + +static WordFM* decaying_string_table = NULL; /* HChar* -> UWord */ + +static Word decaying_string_table_cmp ( UWord s1, UWord s2 ) { + return (Word)VG_(strcmp)( (HChar*)s1, (HChar*)s2 ); +} + +static void log_decaying ( const HChar* format, ... ) PRINTF_CHECK(1, 2); +static void log_decaying ( const HChar* format, ... ) +{ + // get the message into a stack-allocated string. + HChar buf[256]; + VG_(memset)(buf, 0, sizeof(buf)); + va_list vargs; + va_start(vargs,format); + (void) VG_(vsnprintf)(buf, sizeof(buf), format, vargs); + va_end(vargs); + buf[sizeof(buf)-1] = 0; + + // Now see if it already exists in the table of strings that we have. + if (!decaying_string_table) { + decaying_string_table + = VG_(newFM)( VG_(malloc), "syswrap-darwin.pd.1", + VG_(free), decaying_string_table_cmp ); + } + + const HChar* key = NULL; + UWord val = 0; + if (!VG_(lookupFM)(decaying_string_table, + (UWord*)&key, &val, (UWord)&buf[0])) { + // We haven't seen this string before, so strdup it and add + // it to the table. + vg_assert(key == NULL && val == 0); + key = VG_(strdup)("syswrap-darwin.pd.2", buf); + VG_(addToFM)(decaying_string_table, (UWord)key, (UWord)0); + } + + vg_assert(key != NULL && key != &buf[0]); + + // So, finally, |key| is in the tree, and |val| is what it is + // currently associated with. Increment that counter. + val++; + Bool b = VG_(addToFM)(decaying_string_table, (UWord)key, (UWord)val); + vg_assert(b); + + if (-1 != VG_(log2)( (UInt)val )) { + if (val == 1) + VG_(dmsg)("%s\n", key); + else + VG_(dmsg)("%s (repeated %lu times)\n", key, val); + } +} + + /* --------------------------------------------------------------------- Mach port tracking (based on syswrap-generic's fd tracker) ------------------------------------------------------------------ */ @@ -862,10 +920,13 @@ Bool ML_(sync_mappings)(const HChar* when, const HChar* where, UWord num) switch (num) { case 0x00000000: // upd 2370 diff 93+,1- <==dangerous case 0x0000004f: // upd 212 diff 2+,0- + case 0x00000b95: // upd 9826 diff 163+,1- diff scale, dangerous + case 0x00000ba5: // upd 304 diff 0+,0- case 0x0000157f: // upd 201 diff 2+,0- case 0x0000157d: // upd 197 diff 1+,0- case 0x0000333d: // upd 112 diff 0+,0- case 0x0000333f: // upd 223 diff 10+,0- + case 0x000072cd: // upd 8286 diff 98+,0- diff scale case 0x000072ae: // upd 193 diff 10+,0- case 0x000072ec: // upd 319 diff 7+,0- case 0x77303074: // upd 113 diff 3+,0- @@ -1560,7 +1621,7 @@ PRE(fcntl) default: PRINT("fcntl ( %ld, %ld [??] )", ARG1, ARG2); - VG_(printf)("UNKNOWN fcntl %ld!\n", ARG2); + log_decaying("UNKNOWN fcntl %ld!", ARG2); break; } } @@ -2068,12 +2129,7 @@ PRE(__pthread_sigmask) // GrP fixme // JRS: arguments are identical to sigprocmask // (how, sigset_t*, sigset_t*). Perhaps behave identically? - static Bool warned; - if (!warned) { - VG_(printf)("UNKNOWN __pthread_sigmask is unsupported. " - "This warning will not be repeated.\n"); - warned = True; - } + log_decaying("UNKNOWN __pthread_sigmask is unsupported."); SET_STATUS_Success( 0 ); } @@ -7548,9 +7604,9 @@ PRE(mach_msg_host) default: // unknown message to host self - VG_(printf)("UNKNOWN host message [id %d, to %s, reply 0x%x]\n", - mh->msgh_id, name_for_port(mh->msgh_request_port), - mh->msgh_reply_port); + log_decaying("UNKNOWN host message [id %d, to %s, reply 0x%x]", + mh->msgh_id, name_for_port(mh->msgh_request_port), + mh->msgh_reply_port); return; } } @@ -7726,9 +7782,9 @@ PRE(mach_msg_task) default: // unknown message to task self - VG_(printf)("UNKNOWN task message [id %d, to %s, reply 0x%x]\n", - mh->msgh_id, name_for_port(mh->msgh_remote_port), - mh->msgh_reply_port); + log_decaying("UNKNOWN task message [id %d, to %s, reply 0x%x]", + mh->msgh_id, name_for_port(mh->msgh_remote_port), + mh->msgh_reply_port); return; } } @@ -7837,14 +7893,7 @@ PRE(mach_msg) // (but is this only for too-secure processes?) // JRS 11 Nov 2014: this assertion is OK for <= 10.9 but fails on 10.10 # if DARWIN_VERS == DARWIN_10_10 - static UInt ctr = 0; - if (! (mh->msgh_bits & MACH_SEND_TRAILER)) { - ctr++; - if (-1 != VG_(log2)(ctr)) { - VG_(printf)("UNKNOWN mach_msg unhandled " - "MACH_SEND_TRAILER option (shown %u times)\n", ctr); - } - } + log_decaying("UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option"); # else vg_assert(! (mh->msgh_bits & MACH_SEND_TRAILER)); # endif