Merge pull request #911 from goldshtn/trace-params-signature

trace: Allow function signatures in uprobes and kprobes
diff --git a/tools/argdist.py b/tools/argdist.py
index 3bcf43a..f5422d9 100755
--- a/tools/argdist.py
+++ b/tools/argdist.py
@@ -258,7 +258,7 @@
         char needle[] = %s;
         char haystack[sizeof(needle)];
         bpf_probe_read(&haystack, sizeof(haystack), (void *)str);
-        for (int i = 0; i < sizeof(needle); ++i) {
+        for (int i = 0; i < sizeof(needle) - 1; ++i) {
                 if (needle[i] != haystack[i]) {
                         return false;
                 }
diff --git a/tools/tplist.py b/tools/tplist.py
index 627f20e..c7656a6 100755
--- a/tools/tplist.py
+++ b/tools/tplist.py
@@ -68,7 +68,7 @@
 def print_usdt_argument_details(location):
         for idx in xrange(0, location.num_arguments):
                 arg = location.get_argument(idx)
-                print("    argument #%d %s" % (idx, arg))
+                print("    argument #%d %s" % (idx+1, arg))
 
 def print_usdt_details(probe):
         if args.verbosity > 0:
@@ -76,7 +76,7 @@
                 if args.verbosity > 1:
                         for idx in xrange(0, probe.num_locations):
                                 loc = probe.get_location(idx)
-                                print("  location #%d %s" % (idx, loc))
+                                print("  location #%d %s" % (idx+1, loc))
                                 print_usdt_argument_details(loc)
                 else:
                         print("  %d location(s)" % probe.num_locations)
diff --git a/tools/trace.py b/tools/trace.py
index 1a9e3d2..184aff9 100755
--- a/tools/trace.py
+++ b/tools/trace.py
@@ -226,11 +226,11 @@
                 fname = "streq_%d" % Probe.streq_index
                 Probe.streq_index += 1
                 self.streq_functions += """
-static inline bool %s(char const *ignored, unsigned long str) {
+static inline bool %s(char const *ignored, uintptr_t str) {
         char needle[] = %s;
         char haystack[sizeof(needle)];
         bpf_probe_read(&haystack, sizeof(haystack), (void *)str);
-        for (int i = 0; i < sizeof(needle); ++i) {
+        for (int i = 0; i < sizeof(needle) - 1; ++i) {
                 if (needle[i] != haystack[i]) {
                         return false;
                 }
@@ -363,33 +363,35 @@
 
         def _generate_usdt_filter_read(self):
             text = ""
-            if self.probe_type == "u":
-                    for arg, _ in Probe.aliases.items():
-                        if not (arg.startswith("arg") and
-                                (arg in self.filter)):
-                                continue
-                        arg_index = int(arg.replace("arg", ""))
-                        arg_ctype = self.usdt.get_probe_arg_ctype(
-                                self.usdt_name, arg_index)
-                        if not arg_ctype:
-                                self._bail("Unable to determine type of {} "
-                                           "in the filter".format(arg))
-                        text += """
+            if self.probe_type != "u":
+                    return text
+            for arg, _ in Probe.aliases.items():
+                    if not (arg.startswith("arg") and
+                            (arg in self.filter)):
+                            continue
+                    arg_index = int(arg.replace("arg", ""))
+                    arg_ctype = self.usdt.get_probe_arg_ctype(
+                            self.usdt_name, arg_index - 1)
+                    if not arg_ctype:
+                            self._bail("Unable to determine type of {} "
+                                       "in the filter".format(arg))
+                    text += """
         {} {}_filter;
         bpf_usdt_readarg({}, ctx, &{}_filter);
-                        """.format(arg_ctype, arg, arg_index, arg)
-                        self.filter = self.filter.replace(
-                                arg, "{}_filter".format(arg))
+                    """.format(arg_ctype, arg, arg_index, arg)
+                    self.filter = self.filter.replace(
+                            arg, "{}_filter".format(arg))
             return text
 
         def generate_program(self, include_self):
                 data_decl = self._generate_data_decl()
-                # kprobes don't have built-in pid filters, so we have to add
-                # it to the function body:
-                if len(self.library) == 0 and Probe.pid != -1:
+                if Probe.pid != -1:
                         pid_filter = """
         if (__pid != %d) { return 0; }
                 """ % Probe.pid
+                # uprobes can have a built-in tgid filter passed to
+                # attach_uprobe, hence the check here -- for kprobes, we
+                # need to do the tgid test by hand:
                 elif len(self.library) == 0 and Probe.tgid != -1:
                         pid_filter = """
         if (__tgid != %d) { return 0; }
@@ -553,12 +555,12 @@
                         bpf.attach_uretprobe(name=libpath,
                                              sym=self.function,
                                              fn_name=self.probe_name,
-                                             pid=Probe.pid)
+                                             pid=Probe.tgid)
                 else:
                         bpf.attach_uprobe(name=libpath,
                                           sym=self.function,
                                           fn_name=self.probe_name,
-                                          pid=Probe.pid)
+                                          pid=Probe.tgid)
 
 class Tool(object):
         examples = """