[hacking] Some small bugfixes for printCallTraceFromGDB.pl
authorMaximilian Wilhelm <max@rfc2324.org>
Mon, 20 Sep 2010 02:48:57 +0000 (04:48 +0200)
committerMaximilian Wilhelm <max@rfc2324.org>
Mon, 20 Sep 2010 02:48:57 +0000 (04:48 +0200)
 * Make sure last block is stored.
 * Catch lines directly starting with 'at file:line'.
 * Detect new stack trace even without empty before it.

Signed-off-by: Maximilian Wilhelm <max@rfc2324.org>

hacking/printCallTraceFromGDB.pl

index 4f143c2..043042a 100755 (executable)
@@ -79,28 +79,41 @@ while (my $line = <INFILE>) {
        $line_num++;
        chomp $line;
 
+# Expected input format (with leading '#'!!):
+#0   func (..) at file:line
+#1   0x23456789 in func (..) at file:line
+
        if ($line =~ m/^[[:space:]]*$/) {
                if ($calls) {
                        store_call ($calls);
                        $calls = [];
                }
+
+               # Explicitly jump to next line as the real parsing starts with an 'if'
+               next;
        }
 
-# Expected input format (with leading '#'!!):
-#0   func (..) at file:line
-#1   0x23456789 in func (..) at file:line
+       # New block without empty line?
+       elsif ($line =~ m/^#0 /) {
+               if ($calls) {
+                       store_call ($calls);
+                       $calls = [];
+               }
 
-       # Variations
+               # No 'next' here!
+       }
+
+       # Variations of real input lines
        #
-       # a) Read complete line an store it
+       # a) Read complete line and store it
        # b) Read line fragment
        #  1) beginning
-       #  2) n middle parts
+       #  2) middle part
        #  3) ending
        # c) crap
 
        # This has to be a) or b1) ...
-       elsif ($line =~ m/^#[[:digit:]]+[[:space:]]+(0x[[:xdigit:]]+ in )?(.*)$/) {
+       if ($line =~ m/^#[[:digit:]]+[[:space:]]+(0x[[:xdigit:]]+ in )?(.*)$/) {
                # ... so we can safely store this
                $call_line = $2;
 
@@ -122,8 +135,8 @@ while (my $line = <INFILE>) {
                # Remove the leading white spaces from input line but add one for readability.
                $call_line .= " $1";
 
-               # If this lie is complete (read: has 'at file:line' at its end) store it.
-               if ($1 =~ m/.* at [^[:space:]:]+:[[:digit:]]+$/) {
+               # If this line is complete (read: has 'at file:line' at its end) store it.
+               if ($1 =~ m/.*at [^[:space:]:]+:[[:digit:]]+$/) {
                        push @{$calls}, $call_line;
                        $call_line = "";
                }
@@ -137,6 +150,9 @@ while (my $line = <INFILE>) {
 
 }
 
+# Don't forget the last block which maybe was not followed by an empty line!
+store_call ($calls);
+
 close (INFILE);
 
 print_tree ($call_tree, 0);