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:
Jim Cromie 2020-07-19 17:10:53 -06:00 committed by Greg Kroah-Hartman
parent 8037072d81
commit aaebe329bf
2 changed files with 22 additions and 1 deletions

View File

@ -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

View File

@ -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")) {