Re: [PATCH 09/16] dyndbg: accept 'file foo.c:func1' and 'file foo.c:10-100'

From: Jason Baron
Date: Fri Jun 12 2020 - 16:37:06 EST




On 6/5/20 12:26 PM, Jim Cromie wrote:
> 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,4 are treated as func's
>
> Doc these changes, and sprinkle in a few extra wild-card examples and
> trailing # explanation texts.
>
> Signed-off-by: Jim Cromie <jim.cromie@xxxxxxxxx>
> ---
> .../admin-guide/dynamic-debug-howto.rst | 5 +++++
> lib/dynamic_debug.c | 20 ++++++++++++++++++-
> 2 files changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst
> index 2854d418b31b..880d33d1782f 100644
> --- a/Documentation/admin-guide/dynamic-debug-howto.rst
> +++ b/Documentation/admin-guide/dynamic-debug-howto.rst
> @@ -159,6 +159,7 @@ func
> of each callsite. Example::
>
> func svc_tcp_accept
> + func *recv* # in rfcomm, bluetooth, ping, tcp
>
> file
> The given string is compared against either the src-root relative
> @@ -167,6 +168,9 @@ file
>
> file svcsock.c
> 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
> The given string is compared against the module name
> @@ -176,6 +180,7 @@ module
>
> module sunrpc
> module nfsd
> + module drm* # both drm, drm_kms_helper
>
> format
> The given string is searched for in the dynamic debug format
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index d43bc3547d3a..8f250c67acbe 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -321,6 +321,8 @@ static int parse_linerange(struct ddebug_query *query, const char *first)
> } else {
> query->last_lineno = query->first_lineno;
> }
> + vpr_info("parsed line %d-%d\n", query->first_lineno,
> + query->last_lineno);
> return 0;
> }
>
> @@ -357,6 +359,7 @@ static int ddebug_parse_query(char *words[], int nwords,
> {
> unsigned int i;
> int rc = 0;
> + char *fline;
>
> /* check we have an even number of words */
> if (nwords % 2 != 0) {
> @@ -373,7 +376,22 @@ static int ddebug_parse_query(char *words[], int nwords,
> if (!strcmp(words[i], "func")) {
> rc = check_set(&query->function, words[i+1], "func");
> } 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;
> +

coding style here is to use braces for both branches.



> } else if (!strcmp(words[i], "module")) {
> rc = check_set(&query->module, words[i+1], "module");
> } else if (!strcmp(words[i], "format")) {
>