[Patch RFC] Tolerate if nsrcs>1 in iterate_over_srcfile_lines

Frank Ch. Eigler fche@redhat.com
Thu Jun 13 15:08:00 GMT 2013


Jia He <hejianet@gmail.com> writes:

> Now if dwarf_getsrc_file returns by nsrcs>1 in
> dwflpp::iterate_over_srcfile_lines,
> The loop for (int l = lineno; ; l = l + 1) will not be continued.
> But actually it is not correct in some cases.

Could you elaborate why you think it is incorrect?  Some of the
filtering is done deliberately, for example if the compiler debuginfo
cannot give an unambiguous starting PC-address for a source-level
statement.

> --- systemtap-2.2.1.orig/dwflpp.cxx     2013-05-16 10:30:37.000000000 -0400
> +++ systemtap-2.2.1/dwflpp.cxx  2013-06-13 01:59:52.000000000 -0400
> @@ -1619,7 +1619,7 @@ dwflpp::iterate_over_srcfile_lines (char
>           if (line_type == RANGE && lineno > lines[1])
>              break;
>            line_probed = lines_probed.insert(lineno);
> -          if (lineno != l || line_probed.second == false || nsrcs > 1)
> +          if (lineno != l || line_probed.second == false)
>              continue;
>            dwarf_lineaddr (srcsp [0], &line_addr);
>            if (!function_name_matches(func_pattern) && dwarf_haspc
> (function, line_addr) != 1)

For example, this change would ignore srcsp[n] for n>0, which would
need an explanation about how that could come about and why we can
ignore them.


>                  advice << srcfile << ":" << hi_try;
>                advice << ")";
>              }
> -          throw semantic_error (advice.str());
> +          if (sess.verbose > 0)
> +            clog<<advice.str();
> +//          throw semantic_error (advice.str());
>          }

What would be the purpose of this change? 


> test result
> command:stap -L 'kernel.statement("sys_nanosleep@kernel/hrtimer.c:*")'
> in X86_64)
> Before this patch:
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1612") $rmtp:struct
> timespec* $tu:struct timespec
>
> After this patch:
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1602") $rqtp:struct
> timespec* $rmtp:struct timespec* $tu:struct timespec
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1605") $rqtp:struct
> timespec* $rmtp:struct timespec* $tu:struct timespec
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1608") $rmtp:struct
> timespec* $tu:struct timespec
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1611") $rmtp:struct
> timespec* $tu:struct timespec
> kernel.statement("sys_nanosleep@kernel/hrtimer.c:1612") $rmtp:struct
> timespec* $tu:struct timespec

That looks good, as long as those listed probe points map to proper
addresses and give back proper context variables.


- FChE



More information about the Systemtap mailing list