ucalls: use replace error handler (#1888)
Prevents the following error when tracing a java program that contains
non-ascii method name:
Traceback (most recent call last):
File "/usr/share/bcc/tools/lib/ucalls", line 305, in <module>
data = get_data() # [(function, (num calls, latency in ns))]
File "/usr/share/bcc/tools/lib/ucalls", line 266, in get_data
bpf["counts"].items()))
File "/usr/share/bcc/tools/lib/ucalls", line 264, in <lambda>
kv[0].method.decode(),
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 11: ordinal not in range(128)
Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
diff --git a/tools/lib/ucalls.py b/tools/lib/ucalls.py
index 4c81200..97d60f2 100755
--- a/tools/lib/ucalls.py
+++ b/tools/lib/ucalls.py
@@ -255,13 +255,15 @@
def get_data():
# Will be empty when no language was specified for tracing
if args.latency:
- data = list(map(lambda kv: (kv[0].clazz.decode() + "." + \
- kv[0].method.decode(),
+ data = list(map(lambda kv: (kv[0].clazz.decode('utf-8', 'replace') \
+ + "." + \
+ kv[0].method.decode('utf-8', 'replace'),
(kv[1].num_calls, kv[1].total_ns)),
bpf["times"].items()))
else:
- data = list(map(lambda kv: (kv[0].clazz.decode() + "." + \
- kv[0].method.decode(),
+ data = list(map(lambda kv: (kv[0].clazz.decode('utf-8', 'replace') \
+ + "." + \
+ kv[0].method.decode('utf-8', 'replace'),
(kv[1].value, 0)),
bpf["counts"].items()))