From 744cf3ab2a4735510874646ac720b4b28701f16f Mon Sep 17 00:00:00 2001 From: William Cohen Date: Wed, 10 Dec 2008 15:22:53 -0500 Subject: Add information about default MAXNESTING and MAXACTION allowed. --- doc/SystemTap_Beginners_Guide/en-US/Errors.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Errors.xml b/doc/SystemTap_Beginners_Guide/en-US/Errors.xml index ffb70470..910ff510 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Errors.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Errors.xml @@ -807,6 +807,7 @@ An array containing aggregate values contains too many distinct key pairs at thi Too many levels of function call nesting were attempted. + The default nesting of function calls allowed is 10. @@ -843,7 +844,9 @@ An array containing aggregate values contains too many distinct key pairs at thi understainding SystemTap errors - The probe handler attempted to execute too many statements in the probe handler. + The probe handler attempted to execute too many statements in the + probe handler. The default number of actions allow in a probe handler + is 1000. -- cgit From cffd1e12179857f6fc50d848c7ecc35742aca75e Mon Sep 17 00:00:00 2001 From: William Cohen Date: Mon, 15 Dec 2008 14:29:30 -0500 Subject: Minor edits and format corrections. --- doc/SystemTap_Beginners_Guide/en-US/Scripts.xml | 138 ++++++++++----------- .../en-US/Understanding_How_SystemTap_Works.xml | 2 +- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml b/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml index fe2e69f4..bb71625e 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml @@ -129,7 +129,7 @@ SystemTap scripts use the file extension .stp, and - are conatains probes written in the following format: + contains probes written in the following format: @@ -555,21 +555,21 @@ probe timer.s(4) Consider the following sample script: - helloworld.stp - - probe begin - { - printf ("hello world\n") - exit () - } - - +helloworld.stp + +probe begin +{ + printf ("hello world\n") + exit () +} + + In , the event begin (i.e. the start of the session) triggers the handler enclosed in { }, which simply prints hello - world, then exits. + world followed by a new-line, then exits. @@ -666,15 +666,15 @@ probe timer.s(4) To illustrate this, consider the following probe example: - - variables-in-printf-statements.stp - - probe syscall.open - { - printf ("%s(%d) open\n", execname(), pid()) - } - - + +variables-in-printf-statements.stp + +probe syscall.open +{ + printf ("%s(%d) open\n", execname(), pid()) +} + + instructs SystemTap to probe all entries to @@ -688,16 +688,16 @@ probe timer.s(4) to "argument1", "format specifier2" is to "argument2", or is this clear enough? - - vmware-guestd(2206) open - hald(2360) open - hald(2360) open - hald(2360) open - df(3433) open - df(3433) open - df(3433) open - hald(2360) open - + +vmware-guestd(2206) open +hald(2360) open +hald(2360) open +hald(2360) open +df(3433) open +df(3433) open +df(3433) open +hald(2360) open + SystemTap Functions @@ -945,42 +945,42 @@ probe timer.s(4) thread_indent(): - thread_indent.stp - - probe kernel.function("*@net/socket.c") - { - printf ("%s -> %s\n", thread_indent(1), probefunc()) - } - probe kernel.function("*@net/socket.c").return - { - printf ("%s <- %s\n", thread_indent(-1), probefunc()) - } - - +thread_indent.stp + +probe kernel.function("*@net/socket.c") +{ + printf ("%s -> %s\n", thread_indent(1), probefunc()) +} +probe kernel.function("*@net/socket.c").return +{ + printf ("%s <- %s\n", thread_indent(-1), probefunc()) +} + + prints out the thread_indent() and probe functions at each event in the following format: - - 0 ftp(7223): -> sys_socketcall - 1159 ftp(7223): -> sys_socket - 2173 ftp(7223): -> __sock_create - 2286 ftp(7223): -> sock_alloc_inode - 2737 ftp(7223): <- sock_alloc_inode - 3349 ftp(7223): -> sock_alloc - 3389 ftp(7223): <- sock_alloc - 3417 ftp(7223): <- __sock_create - 4117 ftp(7223): -> sock_create - 4160 ftp(7223): <- sock_create - 4301 ftp(7223): -> sock_map_fd - 4644 ftp(7223): -> sock_map_file - 4699 ftp(7223): <- sock_map_file - 4715 ftp(7223): <- sock_map_fd - 4732 ftp(7223): <- sys_socket - 4775 ftp(7223): <- sys_socketcall - + +0 ftp(7223): -> sys_socketcall +1159 ftp(7223): -> sys_socket +2173 ftp(7223): -> __sock_create +2286 ftp(7223): -> sock_alloc_inode +2737 ftp(7223): <- sock_alloc_inode +3349 ftp(7223): -> sock_alloc +3389 ftp(7223): <- sock_alloc +3417 ftp(7223): <- __sock_create +4117 ftp(7223): -> sock_create +4160 ftp(7223): <- sock_create +4301 ftp(7223): -> sock_map_fd +4644 ftp(7223): -> sock_map_file +4699 ftp(7223): <- sock_map_file +4715 ftp(7223): <- sock_map_fd +4732 ftp(7223): <- sys_socket +4775 ftp(7223): <- sys_socketcall + This sample output contains the following information: @@ -1073,15 +1073,15 @@ probe timer.s(4) to it. For example: - - targetexample.stp - - probe syscall.* { - if (pid() == target()) - printf("%s/n", name) - } - - + +targetexample.stp + +probe syscall.* { + if (pid() == target()) + printf("%s/n", name) +} + + When is run with the argument diff --git a/doc/SystemTap_Beginners_Guide/en-US/Understanding_How_SystemTap_Works.xml b/doc/SystemTap_Beginners_Guide/en-US/Understanding_How_SystemTap_Works.xml index 4e61e247..d9fe6ab4 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Understanding_How_SystemTap_Works.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Understanding_How_SystemTap_Works.xml @@ -53,7 +53,7 @@ expiration, session termination, etc. A handler is a series of script language statements that specify the work to be done whenever the event occurs. This work normally includes extracting data from the event context, - storing them into internal variables, or printing results. + storing them into internal variables, and printing results.
-- cgit From 1179271f9a422edf543178d2d02d2bf38334e697 Mon Sep 17 00:00:00 2001 From: William Cohen Date: Mon, 15 Dec 2008 14:34:14 -0500 Subject: Clarify optional else clause. --- doc/SystemTap_Beginners_Guide/en-US/ScriptConstructs.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/ScriptConstructs.xml b/doc/SystemTap_Beginners_Guide/en-US/ScriptConstructs.xml index 2550efce..89334eff 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/ScriptConstructs.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/ScriptConstructs.xml @@ -177,7 +177,8 @@ The statement1 is executed if the condition expression is non-zero. The statement2 is executed if the condition -expression is zero. The else is optional. Both +expression is zero. The else clause +(else statement2)is optional. Both statement1 and statement2 can be statement blocks. -- cgit From 16da491f985baaa0bfbdc9cd0098d508534bf75b Mon Sep 17 00:00:00 2001 From: William Cohen Date: Mon, 15 Dec 2008 14:52:52 -0500 Subject: Minor edits in associative array sections. --- doc/SystemTap_Beginners_Guide/en-US/Array-Operations.xml | 8 ++++---- doc/SystemTap_Beginners_Guide/en-US/Arrays.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Array-Operations.xml b/doc/SystemTap_Beginners_Guide/en-US/Array-Operations.xml index bf496321..00a8673c 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Array-Operations.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Array-Operations.xml @@ -505,7 +505,7 @@ probe timer.s(3) } -This foreach statement instructs the script to process the elements in the array reads in descending order (of associated value). The limit 10 option instructs the script to only process the first ten elements in the array (i.e. the first 10, starting with the highest value). +This foreach statement instructs the script to process the elements in the array reads in descending order (of associated value). The limit 10 option instructs the foreach to only process the first ten iterations (i.e. print the first 10, starting with the highest value).
@@ -665,7 +665,7 @@ probe vfs.read probe timer.s(3) { printf("=======\n") - foreach (count in reads+) + foreach (count in reads-) printf("%s : %d \n", count, reads[count]) delete reads } @@ -673,7 +673,7 @@ probe timer.s(3) probe end { printf("TOTALS\n") - foreach (total in totalreads+) + foreach (total in totalreads-) printf("%s : %d \n", total, totalreads[total]) } @@ -788,7 +788,7 @@ probe timer.s(3) -if([index_expression] in array_name) +if([index_expression] in array_name) statement To illustrate this, consider the following example: diff --git a/doc/SystemTap_Beginners_Guide/en-US/Arrays.xml b/doc/SystemTap_Beginners_Guide/en-US/Arrays.xml index ac320fcd..3d3dec01 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Arrays.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Arrays.xml @@ -161,7 +161,7 @@ foo["harry"] = 25 -You can specify up to 5 index expressons in an array statement, each one delimited by a comma (,). This is useful if you wish to have a key that contains multiple pieces of information. The following line from uses 5 elements for the key: process ID, executable name, user ID, parent ID, and string "W". It associates the value of devname with that key. +You can specify up to 5 index expressons in an array statement, each one delimited by a comma (,). This is useful if you wish to have a key that contains multiple pieces of information. The following line from uses 5 elements for the key: process ID, executable name, user ID, parent process ID, and string "W". It associates the value of devname with that key. device[pid(),execname(),uid(),ppid(),"W"] = devname -- cgit From b3234491c1bf5e845a16f33f6f2c4dffd2bf6a77 Mon Sep 17 00:00:00 2001 From: William Cohen Date: Mon, 15 Dec 2008 16:14:05 -0500 Subject: Minor editing for example scripts. --- .../en-US/Useful_Scripts-inodewatch.xml | 11 +++++++---- .../en-US/Useful_Scripts-sockettrace.xml | 2 +- .../en-US/Useful_Scripts-traceio2.xml | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-inodewatch.xml b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-inodewatch.xml index 098524ae..47cc4e16 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-inodewatch.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-inodewatch.xml @@ -59,7 +59,8 @@ no script in examples need to add references to sources/man pages that explain how "dev_nr = $file->f_dentry->d_inode->i_sb->s_dev" and "($1 << 20 | $2)". - takes the following information about the file as an argument: + takes the following information about the +file as arguments on the command line: script examples file device number (integer format) @@ -81,7 +82,9 @@ no script in examples - The file's device number, in integer format. When this is passed to the script as the first argument, be sure to replace any 0 with a space. + The file's major device number. + + The file's minor device number. The file's inode number. @@ -121,9 +124,9 @@ no script in examples examples of SystemTap scripts -805 is the device number, while 1078319 is the inode number. To start monitoring /etc/crontab, run stap inodewatch.stp 8 5 1078319. +805 is the base-16 (hexadecimal) device number. The lower two digits are the minor device number and the upper digits are the major number. 1078319 is the inode number. To start monitoring /etc/crontab, run stap inodewatch.stp 0x8 0x05 1078319 (The 0x prefixes indicate base-16 values. -The output of this command contains the name and ID of any process performing a read/write, the function it is performing (i.e. vfs_read or vfs_write), the device number (in hex format), and the inode number. contains the output of stap inodewatch.stp 8 5 1078319 (when cat /etc/crontab is executed while the script is running) : +The output of this command contains the name and ID of any process performing a read/write, the function it is performing (i.e. vfs_read or vfs_write), the device number (in hex format), and the inode number. contains the output of stap inodewatch.stp 0x8 0x05 1078319 (when cat /etc/crontab is executed while the script is running) : diff --git a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-sockettrace.xml b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-sockettrace.xml index 9a9e1c55..6e913b48 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-sockettrace.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-sockettrace.xml @@ -51,7 +51,7 @@ socket-trace.stp - + diff --git a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-traceio2.xml b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-traceio2.xml index 4fc7ecc2..7451de98 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-traceio2.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-traceio2.xml @@ -50,7 +50,7 @@ - traceio2-simple.stp + traceio2.stp -- cgit From b1a80a41d336daa1501f56f73558806f15231f3c Mon Sep 17 00:00:00 2001 From: William Cohen Date: Mon, 15 Dec 2008 16:28:41 -0500 Subject: Minor edits error chapter. --- doc/SystemTap_Beginners_Guide/en-US/Errors.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Errors.xml b/doc/SystemTap_Beginners_Guide/en-US/Errors.xml index 910ff510..62e89580 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Errors.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Errors.xml @@ -101,7 +101,7 @@ replicate? - The following invalid SystemTap script is missing the its probe + The following invalid SystemTap script is missing its probe handlers: @@ -473,8 +473,9 @@ probe syscall.open foo refers to. This usually means that SystemTap could not find a match for foo in the - tapset library. The N refers to the column - the error occurred in. + tapset library. The N refers to the + line and column of + the error. how to explain N in previous? "The divergence from the “tree” of probe point namespace is at position N (starting with zero at left)." (from tutorial) -- cgit From 70be2c5b7a1ae10d23bb092a04031a119136aa47 Mon Sep 17 00:00:00 2001 From: ddomingo Date: Tue, 16 Dec 2008 12:06:35 +1000 Subject: corrected index entries as per wcohen --- doc/SystemTap_Beginners_Guide/en-US/Scripts.xml | 100 ++++++++++++------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml b/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml index bb71625e..88aa42ab 100644 --- a/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml +++ b/doc/SystemTap_Beginners_Guide/en-US/Scripts.xml @@ -581,7 +581,7 @@ probe begin exit() - Handlers + functions SystemTap scripts continue to run until the @@ -732,20 +732,20 @@ hald(2360) open functions - handler functions - tid() + tid() + - handler functions - Handlers - tid() + functions + tid() + tid() - Handlers - handler functions + functions + The ID of the current thread. @@ -757,20 +757,20 @@ hald(2360) open functions - handler functions - uid() + + uid() - + uid() - Handlers - handler functions + functions + The ID of the current user. @@ -781,20 +781,20 @@ hald(2360) open functions - handler functions - cpu() + + cpu() - + cpu() - Handlers - handler functions + functions + The current CPU number. @@ -805,20 +805,20 @@ hald(2360) open functions - handler functions - gettimeofday_s() + + gettimeofday_s() - + gettimeofday_s() - Handlers - handler functions + functions + The number of seconds since UNIX epoch (January 1, 1970). @@ -830,20 +830,20 @@ hald(2360) open functions - handler functions - ctime() + + ctime() - + ctime() - Handlers - handler functions + functions + Convert number of seconds since UNIX epoch to date. @@ -865,20 +865,20 @@ hald(2360) open functions - handler functions - pp() + + pp() - + pp() - Handlers - handler functions + functions + A string describing the probe point currently being handled. @@ -897,20 +897,20 @@ hald(2360) open functions - handler functions - thread_indent() + + thread_indent() - + thread_indent() - Handlers - handler functions + functions + This particular function is quite useful, providing you with a way @@ -1047,20 +1047,20 @@ probe kernel.function("*@net/socket.c").return functions - handler functions - target() + + target() - + target() - Handlers - handler functions + functions + Used in conjunction with stap -- cgit From 1f0cfd980bc0a5e3e360f4ee46808b239bca6b55 Mon Sep 17 00:00:00 2001 From: Stan Cox Date: Tue, 16 Dec 2008 10:34:01 -0500 Subject: Convert .mark to .statement(0x) instead of .statement(foo.c:N) --- ChangeLog | 6 ++ runtime/ChangeLog | 4 + runtime/sduprobes.h | 119 +++++++++++++--------------- tapsets.cxx | 46 +++++------ testsuite/ChangeLog | 4 + testsuite/systemtap.base/static_uprobes.exp | 74 +++++++++++++++-- testsuite/systemtap.base/static_uprobes.stp | 14 ---- 7 files changed, 154 insertions(+), 113 deletions(-) delete mode 100644 testsuite/systemtap.base/static_uprobes.stp diff --git a/ChangeLog b/ChangeLog index 9a852834..6eba60bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-12-16 Stan Cox + + * tapsets.cxx (dwarf_builder::build): Consider alignment when + fetching .probes values. Convert .mark to .statement(0x) instead + of .statement(foo.c:N) + 2008-12-11 Dave Brolley PR7087 diff --git a/runtime/ChangeLog b/runtime/ChangeLog index 3f88bae2..7026b276 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,3 +1,7 @@ +2008-12-16 Stan Cox + + * sduprobes.h (STAP_PROBE): Add synthetic reference to probe label. + 2008-12-09 Frank Ch. Eigler * time.c (_stp_gettimeofday_ns): Protect some more against freq=0. diff --git a/runtime/sduprobes.h b/runtime/sduprobes.h index b91dea93..efa25be7 100644 --- a/runtime/sduprobes.h +++ b/runtime/sduprobes.h @@ -9,23 +9,23 @@ #include #if _LP64 -#define STAP_PROBE_STRUCT_ARG \ - __uint64_t probe_arg; +#define STAP_PROBE_STRUCT_ARG(arg) \ + __uint64_t arg; #else -#define STAP_PROBE_STRUCT_ARG \ - long probe_arg __attribute__ ((aligned(8))); +#define STAP_PROBE_STRUCT_ARG(arg) \ + long arg __attribute__ ((aligned(8))); #endif #define STAP_PROBE_STRUCT(probe,type,argc) \ struct _probe_ ## probe \ { \ char probe_name [strlen(#probe)+1]; \ - int probe_type; \ - STAP_PROBE_STRUCT_ARG \ + int probe_type; \ + STAP_PROBE_STRUCT_ARG (probe_arg); \ }; \ static volatile struct _probe_ ## probe _probe_ ## probe __attribute__ ((section (".probes"))) = {#probe,type,argc}; -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE(provider,probe) \ STAP_PROBE_STRUCT(probe,0,0) \ _stap_probe_0 (_probe_ ## probe.probe_name); @@ -34,108 +34,99 @@ struct _probe_ ## probe \ _probe_ ## probe: \ asm volatile ("nop"); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE1(provider,probe,arg1) \ STAP_PROBE_STRUCT(probe,0,1) \ _stap_probe_1 (_probe_ ## probe.probe_name,(size_t)arg1); #else #define STAP_PROBE1(provider,probe,parm1) \ + volatile typeof(parm1) probe ## _arg1 = parm1; \ _probe_ ## probe: \ - asm volatile ("nop"); \ - volatile typeof(parm1) arg1 = parm1; \ + asm volatile ("nop" :: "r"(probe ## _arg1)); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \ - asm volatile ("# %0" :: "r"(arg1)); \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE2(provider,probe,arg1,arg2) \ STAP_PROBE_STRUCT(probe,0,2) \ _stap_probe_2 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2); #else #define STAP_PROBE2(provider,probe,parm1,parm2) \ + volatile typeof(parm1) probe ## _arg1 = parm1; \ + volatile typeof(parm2) probe ## _arg2 = parm2; \ _probe_ ## probe: \ - asm volatile ("nop"); \ - volatile typeof(parm1) arg1 = parm1; \ - volatile typeof(parm2) arg2 = parm2; \ + asm volatile ("nop" :: "r"(probe ## _arg1), "r"(probe ## _arg2)); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe)\ - asm volatile ("# %0" :: "r"(arg1)); \ - asm volatile ("# %0" :: "r"(arg2)); \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE3(provider,probe,arg1,arg2,arg3) \ STAP_PROBE_STRUCT(probe,0,3) \ _stap_probe_3 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3); #else #define STAP_PROBE3(provider,probe,parm1,parm2,parm3) \ + volatile typeof(parm1) probe ## _arg1 = parm1; \ + volatile typeof(parm2) probe ## _arg2 = parm2; \ + volatile typeof(parm3) probe ## _arg3 = parm3; \ _probe_ ## probe: \ - asm volatile ("nop"); \ - volatile typeof(parm1) arg1 = parm1; \ - volatile typeof(parm2) arg2 = parm2; \ - volatile typeof(parm3) arg3 = parm3; \ + asm volatile ("nop" :: "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3)); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \ - asm volatile ("# %0" :: "r"(arg1)); \ - asm volatile ("# %0" :: "r"(arg2)); \ - asm volatile ("# %0" :: "r"(arg3)); \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE4(provider,probe,arg1,arg2,arg3,arg4) \ STAP_PROBE_STRUCT(probe,0,4) \ _stap_probe_4 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3,(size_t)arg4); #else -#define STAP_PROBE4(provider,probe,parm1,parm2,parm3) \ +#define STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \ + volatile typeof(parm1) probe ## _arg1 = parm1; \ + volatile typeof(parm2) probe ## _arg2 = parm2; \ + volatile typeof(parm3) probe ## _arg3 = parm3; \ + volatile typeof(parm4) probe ## _arg4 = parm4; \ _probe_ ## probe: \ - asm volatile ("nop"); \ - volatile typeof(parm1) arg1 = parm1; \ - volatile typeof(parm2) arg2 = parm2; \ - volatile typeof(parm3) arg3 = parm3; \ - volatile typeof(parm4) arg4 = parm4; \ + asm volatile ("nop" "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3), "r"(probe ## _arg4)); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \ - asm volatile ("# %0" :: "r"(arg1)); \ - asm volatile ("# %0" :: "r"(arg2)); \ - asm volatile ("# %0" :: "r"(arg3)); \ - asm volatile ("# %0" :: "r"(arg4)); \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#ifndef USE_STAP_DEBUGINFO_PROBE +#ifdef USE_STAP_PROBE #define STAP_PROBE5(provider,probe,arg1,arg2,arg3,arg4,arg5) \ STAP_PROBE_STRUCT(probe,0,5) \ _stap_probe_5 (_probe_ ## probe.probe_name,(size_t)arg1,(size_t)arg2,(size_t)arg3,(size_t)arg4,(size_t)arg5); #else #define STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) \ + volatile typeof(parm1) probe ## _arg1 = parm1; \ + volatile typeof(parm2) probe ## _arg2 = parm2; \ + volatile typeof(parm3) probe ## _arg3 = parm3; \ + volatile typeof(parm4) probe ## _arg4 = parm4; \ + volatile typeof(parm5) probe ## _arg5 = parm5; \ _probe_ ## probe: \ - asm volatile ("nop"); \ - volatile typeof(parm1) arg1 = parm1; \ - volatile typeof(parm2) arg2 = parm2; \ - volatile typeof(parm3) arg3 = parm3; \ - volatile typeof(parm4) arg4 = parm4; \ - volatile typeof(parm5) arg5 = parm5; \ + asm volatile ("nop" "r"(probe ## _arg1), "r"(probe ## _arg2), "r"(probe ## _arg3), "r"(probe ## _arg4), "r"(probe ## _arg5)); \ STAP_PROBE_STRUCT(probe,1,(size_t)&& _probe_ ## probe) \ - asm volatile ("# %0" :: "r"(arg1)); \ - asm volatile ("# %0" :: "r"(arg2)); \ - asm volatile ("# %0" :: "r"(arg3)); \ - asm volatile ("# %0" :: "r"(arg4)); \ - asm volatile ("# %0" :: "r"(arg5)); \ - asm volatile ("# %0" :: "m" ((_probe_ ## probe.probe_type))); + if (__builtin_expect(_probe_ ## probe.probe_type < 0, 0)) \ + goto _probe_ ## probe; #endif -#define DTRACE_PROBE1(provider,probe,parm1,parm2,parm3,parm4,parm5) \ -STAP_PROBE1(provider,probe,parm1,parm2,parm3,parm4,parm5) -#define DTRACE_PROBE2(provider,probe,parm1,parm2,parm3,parm4,parm5) \ -STAP_PROBE2(provider,probe,parm1,parm2,parm3,parm4,parm5) -#define DTRACE_PROBE3(provider,probe,parm1,parm2,parm3,parm4,parm5) \ -STAP_PROBE3(provider,probe,parm1,parm2,parm3,parm4,parm5) -#define DTRACE_PROBE4(provider,probe,parm1,parm2,parm3,parm4,parm5) \ -STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4,parm5) -#define DTRACE_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) \ -STAP_PROBE5(provider,probe,parm1,parm2,parm3,parm4,parm5) +#define DTRACE_PROBE(provider,probe) \ +STAP_PROBE(provider,probe) +#define DTRACE_PROBE1(provider,probe,parm1) \ +STAP_PROBE1(provider,probe,parm1) +#define DTRACE_PROBE2(provider,probe,parm1,parm2) \ +STAP_PROBE2(provider,probe,parm1,parm2) +#define DTRACE_PROBE3(provider,probe,parm1,parm2,parm3) \ +STAP_PROBE3(provider,probe,parm1,parm2,parm3) +#define DTRACE_PROBE4(provider,probe,parm1,parm2,parm3,parm4) \ +STAP_PROBE4(provider,probe,parm1,parm2,parm3,parm4) diff --git a/tapsets.cxx b/tapsets.cxx index 4d9a021d..0efaf455 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -3856,7 +3856,8 @@ query_cu (Dwarf_Die * cudie, void * arg) // Verify that a raw address matches the beginning of a // statement. This is a somewhat lame check that the address // is at the start of an assembly instruction. - if (q->has_statement_num) + // Avoid for now since this thwarts a probe on a statement in a macro + if (0 && q->has_statement_num) { Dwarf_Addr queryaddr = q->statement_num_val; dwarf_line_t address_line(dwarf_getsrc_die(cudie, queryaddr)); @@ -5297,14 +5298,14 @@ dwarf_builder::build(systemtap_session & sess, location->components[0]->arg = new literal_string(sess.cmd); ((literal_map_t&)parameters)[location->components[0]->functor] = location->components[0]->arg; Dwarf_Addr bias; - Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (dw->module, &bias)) - ?: dwfl_module_getelf (dw->module, &bias)); + Elf* elf = dwfl_module_getelf (dw->module, &bias); size_t shstrndx; Elf_Scn *probe_scn = NULL; dwfl_assert ("getshstrndx", elf_getshstrndx (elf, &shstrndx)); __uint64_t probe_arg = 0; int probe_type = no_debuginfo; + char *probe_name; // Find the .probes section where the static probe label and arg are stored while ((probe_scn = elf_nextscn (elf, probe_scn))) { @@ -5314,23 +5315,24 @@ dwarf_builder::build(systemtap_session & sess, if (strcmp (elf_strptr (elf, shstrndx, shdr->sh_name), ".probes") != 0) continue; - Elf_Data *pdata = elf_getdata (probe_scn, NULL); + Elf_Data *pdata = elf_getdata_rawchunk (elf, shdr->sh_offset, shdr->sh_size, ELF_T_BYTE); assert (pdata != NULL); size_t probe_scn_offset = 0; while (probe_scn_offset < pdata->d_size) { - char *probe_name = (char*)pdata->d_buf + probe_scn_offset; - probe_scn_offset += strlen(probe_name); - probe_scn_offset += sizeof(int) - (probe_scn_offset % sizeof(int)); - probe_type = *(((char*)pdata->d_buf + probe_scn_offset)); + probe_name = (char*)pdata->d_buf + probe_scn_offset; + probe_scn_offset += strlen(probe_name) + 1; + if (probe_scn_offset % (sizeof(int))) + probe_scn_offset += sizeof(int) - (probe_scn_offset % sizeof(int)); + probe_type = *((int*)((char*)pdata->d_buf + probe_scn_offset)); probe_scn_offset += sizeof(int); - probe_arg = *((__uint32_t*)((char*)pdata->d_buf + probe_scn_offset)); - probe_arg <<= 32; - probe_arg |= *((__uint32_t*)((char*)pdata->d_buf + probe_scn_offset + 4)); + if (probe_scn_offset % (sizeof(__uint64_t))) + probe_scn_offset += sizeof(__uint64_t) - (probe_scn_offset % sizeof(__uint64_t)); + probe_arg = *((__uint64_t*)((char*)pdata->d_buf + probe_scn_offset)); if (strcmp (location->components[1]->arg->tok->content.c_str(), probe_name) == 0) break; - probe_scn_offset += sizeof(__uint64_t); - probe_scn_offset += sizeof(__uint64_t)*2 - (probe_scn_offset % (sizeof(__uint64_t)*2)); + if (probe_scn_offset % (sizeof(__uint64_t)*2)) + probe_scn_offset = (probe_scn_offset + sizeof(__uint64_t)*2) - (probe_scn_offset % (sizeof(__uint64_t)*2)); } } @@ -5378,7 +5380,6 @@ dwarf_builder::build(systemtap_session & sess, size_t cuhl; Dwarf_Off noff = 0; const char *probe_file = "@sduprobes.c"; - int probe_line; // Find where the probe instrumentation landing points are defined while (dwarf_nextcu (dwarf, off = noff, &noff, &cuhl, NULL, NULL, NULL) == 0) { @@ -5386,6 +5387,8 @@ dwarf_builder::build(systemtap_session & sess, Dwarf_Die *cudie = dwarf_offdie (dwarf, off + cuhl, &cudie_mem); if (cudie == NULL) continue; + if (0) + printf("2 diename=%s module_name=%s probe_type=%d probe_arg=%#Lx\n",dwarf_diename(&cudie_mem),module_name.c_str(), (int)probe_type, (long long)probe_arg); if (probe_type == no_debuginfo) { if (strncmp (dwarf_diename(&cudie_mem), "sduprobes", 9) == 0) @@ -5393,15 +5396,6 @@ dwarf_builder::build(systemtap_session & sess, break; } } - else - { - Dwarf_Line *dwarf_line = dwarf_getsrc_die (cudie, probe_arg); - if (dwarf_line == NULL) - continue; - dwarf_lineno (dwarf_line, &probe_line); - probe_file = (dwarf_diename(&cudie_mem) ?: ""); - break; - } } location->components[1]->functor = TOK_STATEMENT; if (probe_type == no_debuginfo) @@ -5414,11 +5408,9 @@ dwarf_builder::build(systemtap_session & sess, } else { - char *pline; - if (asprintf (&pline, "*@%s:%d", probe_file, probe_line + 1) < 0) - return; - location->components[1]->arg = new literal_string(pline); + location->components[1]->arg = new literal_number((int)probe_arg); } + ((literal_map_t&)parameters)[TOK_STATEMENT] = location->components[1]->arg; dw->module = 0; } diff --git a/testsuite/ChangeLog b/testsuite/ChangeLog index 8e174efc..dc91a215 100644 --- a/testsuite/ChangeLog +++ b/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-12-16 Stan Cox + + * systemtap.base/static_uprobes.exp: Generate our own probes file. + 2008-12-09 Frank Ch. Eigler PR6961. diff --git a/testsuite/systemtap.base/static_uprobes.exp b/testsuite/systemtap.base/static_uprobes.exp index 78641d3f..f3f26d8a 100644 --- a/testsuite/systemtap.base/static_uprobes.exp +++ b/testsuite/systemtap.base/static_uprobes.exp @@ -8,6 +8,7 @@ set sup_flags "additional_flags=-iquote$env(SYSTEMTAP_RUNTIME) additional_flags= set fp [open $sup_srcpath "w"] puts $fp " #include +#define USE_STAP_PROBE 1 #include \"sduprobes.h\" foo () @@ -24,12 +25,13 @@ bar (int i) baz (int i, char* s) { + STAP_PROBE1(tstlabel,label0,i); if (i == 0) i = 1000; STAP_PROBE2(tstlabel,label3,i,s); } -buz () +buz (int parm) { } @@ -39,6 +41,7 @@ main () foo(); bar(2); baz(3,\"abc\"); + buz(4); } " close $fp @@ -52,33 +55,85 @@ if { $res != "" } { pass "compiling static_uprobes.c" } +set fp [open "[pwd]/static_uprobes.stp" "w"] +puts $fp " +probe process(\"static_uprobes.x\").mark(\"label0\") +{ + printf(\"In label0 probe %#x\\n\", \$arg1) +} +probe process(\"static_uprobes.x\").mark(\"label1\") +{ + printf(\"In label1 probe\\n\") +} +probe process(\"static_uprobes.x\").mark(\"label2\") +{ + printf(\"In label2 probe %#x\\n\", \$arg1) +} +probe process(\"static_uprobes.x\").mark(\"label3\") +{ + printf(\"In label3 probe %#x %#x\\n\", \$arg1, \$arg2) +} +" +close $fp + set ok 0 -spawn stap -c $sup_exepath $srcdir/$subdir/static_uprobes.stp +verbose -log "spawn stap -c $sup_exepath [pwd]/static_uprobes.stp" +spawn stap -c $sup_exepath [pwd]/static_uprobes.stp expect { -timeout 180 -re {In label1 probe} { incr ok; exp_continue } -re {In label2 probe 0x2} { incr ok; exp_continue } + -re {In label0 probe 0x3} { incr ok; exp_continue } -re {In label3 probe 0x3 0x[0-9a-f][0-9a-f]} { incr ok; exp_continue } timeout { fail "$test (timeout)" } eof { } } +if {$ok == 4} { pass "$test" } { fail "$test ($ok)" } +set ok 0 + # Now do a debuginfo style probe of the above test set fp [open "[pwd]/static_uprobes.sh" "w"] puts $fp " ed $sup_srcpath < Date: Tue, 16 Dec 2008 15:48:29 -0800 Subject: Clean up .spec file typos, Requires nits. --- ChangeLog | 8 ++++++++ systemtap.spec | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6eba60bb..ab8f482d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-12-16 Roland McGrath + + * systemtap.spec (Requires): Add kernel-devel, is correct virtual + provide in kernel-*-devel rpms. + (with_sqlite): Typo fix in default defn check. + [%{with_sqlite}] (Requires): Remove. BuildRequires causes the correct + automatic dependency. + 2008-12-16 Stan Cox * tapsets.cxx (dwarf_builder::build): Consider alignment when diff --git a/systemtap.spec b/systemtap.spec index c8c6b030..479e2b4c 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -1,5 +1,5 @@ %{!?release: %define release 1} -%{!?with_sqllite: %define with_sqlite 1} +%{!?with_sqlite: %define with_sqlite 1} %{!?with_docs: %define with_docs 1} %{!?with_crash: %define with_crash 0} %{!?with_bundled_elfutils: %define with_bundled_elfutils 0} @@ -20,13 +20,13 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: kernel >= 2.6.9-11 %if %{with_sqlite} BuildRequires: sqlite-devel -Requires: sqlite %endif %if %{with_crash} BuildRequires: crash-devel zlib-devel %endif -# Requires: kernel-devel -# or is that kernel-smp-devel? kernel-hugemem-devel? +# Alternate kernel packages kernel-PAE-devel et al have a virtual +# provide for kernel-devel, so this requirement does the right thing. +Requires: kernel-devel Requires: gcc make # Suggest: kernel-debuginfo Requires: systemtap-runtime = %{version}-%{release} -- cgit