Tweak filter_xml_frames. Suppress frames containing neither a
function name nor any source code reference.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13559 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/tests/filter_xml_frames b/tests/filter_xml_frames
index fc92542..f1fa3f0 100755
--- a/tests/filter_xml_frames
+++ b/tests/filter_xml_frames
@@ -1,14 +1,23 @@
#! /usr/bin/env perl
-# Remove <frame>.....</frame> containing an <obj> poining to
-# some system library.
+# Remove certain <frame>.....</frame> records that are suspected to point
+# to some kind of system library. Those are
+# - frames with <obj>/lib/....
+# - frames with <obj>/usr/lib/....
+# - frames without source informatino and without a function name
+#
+# There may be others...
use strict;
use warnings;
my $in_frame = 0;
my $frame = "";
-my $ignore_frame = 0;
+
+# Info about the current frame
+my $has_source_info = 0; # <dir>, <file>, <line>
+my $has_function_name = 0; # <fn>
+my $has_system_obj = 0; # <obj>/lib... or <obj>/usr/lib...
while (my $line = <>)
{
@@ -16,7 +25,7 @@
if ($line =~ /<frame>/) {
$frame = $line;
$in_frame = 1;
- $ignore_frame = 0
+ $has_source_info = $has_function_name = $has_system_obj = 0;
} else {
print $line;
}
@@ -26,14 +35,19 @@
# We're in a frame
$frame .= $line;
if ($line =~ /<\/frame>/) {
+# Is this a frame we want to keep?
+ my $ignore_frame = $has_system_obj ||
+ (! $has_source_info && ! $has_function_name);
if (! $ignore_frame) {
print $frame;
}
$in_frame = 0;
} else {
-# The may require tweaking; currently /lib and /usr/lib are matched
- $ignore_frame = 1 if ($line =~ /<obj>\/lib/);
- $ignore_frame = 1 if ($line =~ /<obj>\/usr\/lib/);
+ $has_source_info = 1 if ($line =~ /<(dir|file|line)>/);
+ $has_function_name = 1 if ($line =~ /<fn>/);
+# This may require tweaking; currently /lib and /usr/lib are matched
+ $has_system_obj = 1 if ($line =~ /<obj>\/lib/);
+ $has_system_obj = 1 if ($line =~ /<obj>\/usr\/lib/);
}
}