| Index: tools/valgrind/memcheck_analyze.py
|
| ===================================================================
|
| --- tools/valgrind/memcheck_analyze.py (revision 25735)
|
| +++ tools/valgrind/memcheck_analyze.py (working copy)
|
| @@ -248,12 +248,6 @@
|
| # </frame>
|
| # although the dir, file, and line elements are missing if there is
|
| # no debug info.
|
| - #
|
| - # With our patch for https://bugs.kde.org/show_bug.cgi?id=205000 in,
|
| - # the file also includes records of the form
|
| - # <load_obj><obj>/usr/lib/libgcc_s.1.dylib</obj><ip>0x27000</ip></load_obj>
|
| - # giving the filename and load address of each binary that was mapped
|
| - # into the process.
|
|
|
| self._kind = getTextOf(error_node, "kind")
|
| self._backtraces = []
|
| @@ -378,10 +372,31 @@
|
| show_all_leaks: whether to show even less important leaks
|
| '''
|
|
|
| + # Beyond the detailed errors parsed by ValgrindError above,
|
| + # the xml file contain records describing suppressions that were used:
|
| + # <suppcounts>
|
| + # <pair>
|
| + # <count>28</count>
|
| + # <name>pango_font_leak_todo</name>
|
| + # </pair>
|
| + # <pair>
|
| + # <count>378</count>
|
| + # <name>bug_13243</name>
|
| + # </pair>
|
| + # </suppcounts
|
| + # Collect these and print them at the end.
|
| + #
|
| + # With our patch for https://bugs.kde.org/show_bug.cgi?id=205000 in,
|
| + # the file also includes records of the form
|
| + # <load_obj><obj>/usr/lib/libgcc_s.1.dylib</obj><ip>0x27000</ip></load_obj>
|
| + # giving the filename and load address of each binary that was mapped
|
| + # into the process.
|
| +
|
| global TheAddressTable
|
| if use_gdb:
|
| TheAddressTable = _AddressTable()
|
| self._errors = set()
|
| + self._suppcounts = {}
|
| badfiles = set()
|
| start = time.time()
|
| self._parse_failed = False
|
| @@ -449,6 +464,15 @@
|
| error = ValgrindError(source_dir, raw_error, commandline)
|
| self._errors.add(error)
|
|
|
| + suppcountlist = parsed_file.getElementsByTagName("suppcounts")[0]
|
| + for node in suppcountlist.getElementsByTagName("pair"):
|
| + count = getTextOf(node, "count");
|
| + name = getTextOf(node, "name");
|
| + if name in self._suppcounts:
|
| + self._suppcounts[name] += int(count)
|
| + else:
|
| + self._suppcounts[name] = int(count)
|
| +
|
| if len(badfiles) > 0:
|
| logging.warn("valgrind didn't finish writing %d files?!" % len(badfiles))
|
| for file in badfiles:
|
| @@ -460,6 +484,13 @@
|
| logging.error("FAIL! Couldn't parse Valgrind output file")
|
| return -2
|
|
|
| + print "-----------------------------------------------------"
|
| + print "Suppressions used:"
|
| + print " count name"
|
| + for item in sorted(self._suppcounts.items(), key=lambda (k,v): (v,k)):
|
| + print "%7s %s" % (item[1], item[0])
|
| + print "-----------------------------------------------------"
|
| +
|
| if self._errors:
|
| logging.error("FAIL! There were %s errors: " % len(self._errors))
|
|
|
|
|