forked from mirrors/linux
		
	dyndbg: accept 'file foo.c:func1' and 'file foo.c:10-100'
Accept these additional query forms:
   echo "file $filestr +_" > control
       path/to/file.c:100	# as from control, column 1
       path/to/file.c:1-100	# or any legal line-range
       path/to/file.c:func_A	# as from an editor/browser
       path/to/file.c:drm_*	# wildcards still work
       path/to/file.c:*_foo	# lead wildcard too
1st 2 examples are treated as line-ranges, 3-5 are treated as func's
Doc these changes, and sprinkle in a few extra wild-card examples and
trailing # explanation texts.
Acked-by: <jbaron@akamai.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Link: https://lore.kernel.org/r/20200719231058.1586423-14-jim.cromie@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									8037072d81
								
							
						
					
					
						commit
						aaebe329bf
					
				
					 2 changed files with 22 additions and 1 deletions
				
			
		| 
						 | 
					@ -164,6 +164,7 @@ func
 | 
				
			||||||
    of each callsite.  Example::
 | 
					    of each callsite.  Example::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	func svc_tcp_accept
 | 
						func svc_tcp_accept
 | 
				
			||||||
 | 
						func *recv*		# in rfcomm, bluetooth, ping, tcp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
file
 | 
					file
 | 
				
			||||||
    The given string is compared against either the src-root relative
 | 
					    The given string is compared against either the src-root relative
 | 
				
			||||||
| 
						 | 
					@ -172,6 +173,9 @@ file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	file svcsock.c
 | 
						file svcsock.c
 | 
				
			||||||
	file kernel/freezer.c	# ie column 1 of control file
 | 
						file kernel/freezer.c	# ie column 1 of control file
 | 
				
			||||||
 | 
						file drivers/usb/*	# all callsites under it
 | 
				
			||||||
 | 
						file inode.c:start_*	# parse :tail as a func (above)
 | 
				
			||||||
 | 
						file inode.c:1-100	# parse :tail as a line-range (above)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module
 | 
					module
 | 
				
			||||||
    The given string is compared against the module name
 | 
					    The given string is compared against the module name
 | 
				
			||||||
| 
						 | 
					@ -181,6 +185,7 @@ module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	module sunrpc
 | 
						module sunrpc
 | 
				
			||||||
	module nfsd
 | 
						module nfsd
 | 
				
			||||||
 | 
						module drm*	# both drm, drm_kms_helper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
format
 | 
					format
 | 
				
			||||||
    The given string is searched for in the dynamic debug format
 | 
					    The given string is searched for in the dynamic debug format
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -359,6 +359,7 @@ static int ddebug_parse_query(char *words[], int nwords,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
	int rc = 0;
 | 
						int rc = 0;
 | 
				
			||||||
 | 
						char *fline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* check we have an even number of words */
 | 
						/* check we have an even number of words */
 | 
				
			||||||
	if (nwords % 2 != 0) {
 | 
						if (nwords % 2 != 0) {
 | 
				
			||||||
| 
						 | 
					@ -374,7 +375,22 @@ static int ddebug_parse_query(char *words[], int nwords,
 | 
				
			||||||
		if (!strcmp(words[i], "func")) {
 | 
							if (!strcmp(words[i], "func")) {
 | 
				
			||||||
			rc = check_set(&query->function, words[i+1], "func");
 | 
								rc = check_set(&query->function, words[i+1], "func");
 | 
				
			||||||
		} else if (!strcmp(words[i], "file")) {
 | 
							} else if (!strcmp(words[i], "file")) {
 | 
				
			||||||
			rc = check_set(&query->filename, words[i+1], "file");
 | 
								if (check_set(&query->filename, words[i+1], "file"))
 | 
				
			||||||
 | 
									return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* tail :$info is function or line-range */
 | 
				
			||||||
 | 
								fline = strchr(query->filename, ':');
 | 
				
			||||||
 | 
								if (!fline)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								*fline++ = '\0';
 | 
				
			||||||
 | 
								if (isalpha(*fline) || *fline == '*' || *fline == '?') {
 | 
				
			||||||
 | 
									/* take as function name */
 | 
				
			||||||
 | 
									if (check_set(&query->function, fline, "func"))
 | 
				
			||||||
 | 
										return -EINVAL;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if (parse_linerange(query, fline))
 | 
				
			||||||
 | 
										return -EINVAL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		} else if (!strcmp(words[i], "module")) {
 | 
							} else if (!strcmp(words[i], "module")) {
 | 
				
			||||||
			rc = check_set(&query->module, words[i+1], "module");
 | 
								rc = check_set(&query->module, words[i+1], "module");
 | 
				
			||||||
		} else if (!strcmp(words[i], "format")) {
 | 
							} else if (!strcmp(words[i], "format")) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue