Commit ec9d42c8 authored by Brendan Gregg's avatar Brendan Gregg Committed by GitHub

Merge pull request #906 from goldshtn/valid-idents

argdist, trace: Support non-C identifier names
parents 23e0de79 3fa7ba1e
...@@ -159,7 +159,7 @@ u64 __time = bpf_ktime_get_ns(); ...@@ -159,7 +159,7 @@ u64 __time = bpf_ktime_get_ns();
if parts[0] not in ["r", "p", "t", "u"]: if parts[0] not in ["r", "p", "t", "u"]:
self._bail("probe type must be 'p', 'r', 't', or 'u'" + self._bail("probe type must be 'p', 'r', 't', or 'u'" +
" but got '%s'" % parts[0]) " but got '%s'" % parts[0])
if re.match(r"\w+\(.*\)", parts[2]) is None: if re.match(r"\S+\(.*\)", parts[2]) is None:
self._bail(("function signature '%s' has an invalid " + self._bail(("function signature '%s' has an invalid " +
"format") % parts[2]) "format") % parts[2])
...@@ -173,6 +173,9 @@ u64 __time = bpf_ktime_get_ns(); ...@@ -173,6 +173,9 @@ u64 __time = bpf_ktime_get_ns();
self._bail("no exprs specified") self._bail("no exprs specified")
self.exprs = exprs.split(',') self.exprs = exprs.split(',')
def _make_valid_identifier(self, ident):
return re.sub(r'[^A-Za-z0-9_]', '_', ident)
def __init__(self, tool, type, specifier): def __init__(self, tool, type, specifier):
self.usdt_ctx = None self.usdt_ctx = None
self.streq_functions = "" self.streq_functions = ""
...@@ -196,8 +199,9 @@ u64 __time = bpf_ktime_get_ns(); ...@@ -196,8 +199,9 @@ u64 __time = bpf_ktime_get_ns();
self.tp_event = self.function self.tp_event = self.function
elif self.probe_type == "u": elif self.probe_type == "u":
self.library = parts[1] self.library = parts[1]
self.probe_func_name = "%s_probe%d" % \ self.probe_func_name = self._make_valid_identifier(
(self.function, Probe.next_probe_index) "%s_probe%d" % \
(self.function, Probe.next_probe_index))
self._enable_usdt_probe() self._enable_usdt_probe()
else: else:
self.library = parts[1] self.library = parts[1]
...@@ -233,10 +237,12 @@ u64 __time = bpf_ktime_get_ns(); ...@@ -233,10 +237,12 @@ u64 __time = bpf_ktime_get_ns();
self.entry_probe_required = self.probe_type == "r" and \ self.entry_probe_required = self.probe_type == "r" and \
(any(map(check, self.exprs)) or check(self.filter)) (any(map(check, self.exprs)) or check(self.filter))
self.probe_func_name = "%s_probe%d" % \ self.probe_func_name = self._make_valid_identifier(
(self.function, Probe.next_probe_index) "%s_probe%d" % \
self.probe_hash_name = "%s_hash%d" % \ (self.function, Probe.next_probe_index))
(self.function, Probe.next_probe_index) self.probe_hash_name = self._make_valid_identifier(
"%s_hash%d" % \
(self.function, Probe.next_probe_index))
Probe.next_probe_index += 1 Probe.next_probe_index += 1
def _enable_usdt_probe(self): def _enable_usdt_probe(self):
......
...@@ -76,8 +76,7 @@ class Probe(object): ...@@ -76,8 +76,7 @@ class Probe(object):
self.probe_num = Probe.probe_count self.probe_num = Probe.probe_count
self.probe_name = "probe_%s_%d" % \ self.probe_name = "probe_%s_%d" % \
(self._display_function(), self.probe_num) (self._display_function(), self.probe_num)
if self.probe_name.find(".") > 0: # for golang self.probe_name = re.sub(r'[^A-Za-z0-9_]', '_', self.probe_name)
self.probe_name = self.probe_name.replace(".", "_DOT_")
def __str__(self): def __str__(self):
return "%s:%s:%s FLT=%s ACT=%s/%s" % (self.probe_type, return "%s:%s:%s FLT=%s ACT=%s/%s" % (self.probe_type,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment