[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Crash-utility] RFC: Improving crash's search speed



On Wed, 2011-01-26 at 20:29 +0000, Dave Anderson wrote:

> 
> I've pretty much got -p working OK, and next I'll plug in the -KVM restrictors. 

By the way, thanks for running with this.


>  
> > Today I'm trying to find out why parse_line() is messing up when given
> > more than one string in ""'s.
> 
> Not sure I understand how you can do that, but don't let me interfere...

The syntax for the search command:
    search [-s start | -k | -u] [-e end | -l length] [-m mask] value ...

allows multiple values for simultaneous search.  For example:

crash-5.1.1str>  search -k 00007ffffd401e28  00007f29a0cbeb9f
ffff88011e889f70: 7ffffd401e28
ffff88011e889fd8: 7f29a0cbeb9f

I thought I'd use a similar syntax for strings (-c for "chars", looking
for a better letter, maybe -S):

crash-5.1.1str> search -k -c "Memory value expected" "No such file or"

The current version of parse_line in tools.c has a problem with repeated
strings, so that it delivers the following in the value[] array:

(gdb) p value[0]
$1 = 0xb74a04 "Memory value expected"
(gdb) p value[1]
$2 = 0xb74a1b "\"No"
(gdb) p value[2]
$3 = 0xb74a1f "such"
(gdb) p value[3]
$4 = 0xb74a24 "file"
(gdb) p value[4]
$5 = 0xb74a29 "or\""

With the attached patch, it delivers:

(gdb) p value[0]
$1 = 0xb77a24 "Memory value expected"
(gdb) p value[1]
$2 = 0xb77a3c "No such file or"

I don't think it messes anything else up...

Bob Montgomery




--- tools.c.orig	2011-01-26 13:30:21.000000000 -0700
+++ tools.c	2011-01-26 13:34:26.000000000 -0700
@@ -171,6 +171,10 @@ parse_line(char *str, char *argv[])
 	        case ' ':
 	        case '\t':
 	            str[i++] = NULLCHAR;
+
+	            while (str[i] == ' ' || str[i] == '\t') {
+	                i++;
+	            }
 	
 	            if (str[i] == '"') {    
 	                str[i] = ' ';
@@ -182,9 +186,6 @@ parse_line(char *str, char *argv[])
                         expression = TRUE;
                     }
 	
-	            while (str[i] == ' ' || str[i] == '\t') {
-	                i++;
-	            }
 	
 	            if (str[i] != NULLCHAR && str[i] != '\n') {
 	                argv[j++] = &str[i];

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]