Commit b96ebcd2 authored by jeromemarchand's avatar jeromemarchand Committed by yonghong-song

Bytes/string encoding (#2004)

* tools: uses 'replace' error handler by default in decode()

Tools might encouter characters from non utf-8 charset (e.g. a file
name). When this happen, it's better to replace the unexpected
character by a question mark than crash the tool when all we do is
to print the string.

* tools: fix a bytes/string issue in attach_perf_event()
parent ec3fe90b
...@@ -57,7 +57,7 @@ print("%-9s %-6s %s" % ("TIME", "PID", "COMMAND")) ...@@ -57,7 +57,7 @@ print("%-9s %-6s %s" % ("TIME", "PID", "COMMAND"))
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%-9s %-6d %s" % (strftime("%H:%M:%S"), event.pid, print("%-9s %-6d %s" % (strftime("%H:%M:%S"), event.pid,
event.str.decode())) event.str.decode('utf-8', 'replace')))
b["events"].open_perf_buffer(print_event) b["events"].open_perf_buffer(print_event)
while 1: while 1:
......
...@@ -176,8 +176,8 @@ def print_event(cpu, data, size): ...@@ -176,8 +176,8 @@ def print_event(cpu, data, size):
delta = float(delta) + (event.ts - prev_ts) delta = float(delta) + (event.ts - prev_ts)
print("%-14.9f %-14.14s %-6s %-7s %-2s %-9s %-7s %7.2f" % ( print("%-14.9f %-14.14s %-6s %-7s %-2s %-9s %-7s %7.2f" % (
delta / 1000000, event.name.decode(), event.pid, delta / 1000000, event.name.decode('utf-8', 'replace'), event.pid,
event.disk_name.decode(), rwflg, val, event.disk_name.decode('utf-8', 'replace'), rwflg, val,
event.len, float(event.delta) / 1000000)) event.len, float(event.delta) / 1000000))
prev_ts = event.ts prev_ts = event.ts
......
...@@ -221,8 +221,8 @@ while 1: ...@@ -221,8 +221,8 @@ while 1:
# print line # print line
avg_ms = (float(v.us) / 1000) / v.io avg_ms = (float(v.us) / 1000) / v.io
print("%-6d %-16s %1s %-3d %-3d %-8s %5s %7s %6.2f" % (k.pid, print("%-6d %-16s %1s %-3d %-3d %-8s %5s %7s %6.2f" % (k.pid,
k.name.decode(), "W" if k.rwflag else "R", k.major, k.minor, k.name.decode('utf-8', 'replace'), "W" if k.rwflag else "R",
diskname, v.io, v.bytes / 1024, avg_ms)) k.major, k.minor, diskname, v.io, v.bytes / 1024, avg_ms))
line += 1 line += 1
if line >= maxrows: if line >= maxrows:
......
...@@ -316,12 +316,14 @@ def print_event(cpu, data, size): ...@@ -316,12 +316,14 @@ def print_event(cpu, data, size):
if (csv): if (csv):
print("%d,%s,%d,%s,%d,%d,%d,%s" % ( print("%d,%s,%d,%s,%d,%d,%d,%s" % (
event.ts_us, event.task.decode(), event.pid, type, event.size, event.ts_us, event.task.decode('utf-8', 'replace'), event.pid,
event.offset, event.delta_us, event.file.decode())) type, event.size, event.offset, event.delta_us,
event.file.decode('utf-8', 'replace')))
return return
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"), print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
event.task.decode(), event.pid, type, event.size, event.offset / 1024, event.task.decode('utf-8', 'replace'), event.pid, type, event.size,
float(event.delta_us) / 1000, event.file.decode())) event.offset / 1024, float(event.delta_us) / 1000,
event.file.decode('utf-8', 'replace')))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -72,7 +72,7 @@ def get_processes_stats( ...@@ -72,7 +72,7 @@ def get_processes_stats(
counts = bpf.get_table("counts") counts = bpf.get_table("counts")
stats = defaultdict(lambda: defaultdict(int)) stats = defaultdict(lambda: defaultdict(int))
for k, v in counts.items(): for k, v in counts.items():
stats["%d-%d-%s" % (k.pid, k.uid, k.comm.decode())][k.ip] = v.value stats["%d-%d-%s" % (k.pid, k.uid, k.comm.decode('utf-8', 'replace'))][k.ip] = v.value
stats_list = [] stats_list = []
for pid, count in sorted(stats.items(), key=lambda stat: stat[0]): for pid, count in sorted(stats.items(), key=lambda stat: stat[0]):
......
...@@ -148,8 +148,8 @@ def print_event(cpu, data, size): ...@@ -148,8 +148,8 @@ def print_event(cpu, data, size):
else: else:
name = "?" name = "?"
print("%-9s %-6d %-6d %-16s %-4d %-20s %d" % (strftime("%H:%M:%S"), print("%-9s %-6d %-6d %-16s %-4d %-20s %d" % (strftime("%H:%M:%S"),
event.uid, event.pid, event.comm.decode(), event.cap, name, event.uid, event.pid, event.comm.decode('utf-8', 'replace'),
event.audit)) event.cap, name, event.audit))
# loop with callback to print_event # loop with callback to print_event
b["events"].open_perf_buffer(print_event) b["events"].open_perf_buffer(print_event)
......
...@@ -153,8 +153,9 @@ start_ts = time.time() ...@@ -153,8 +153,9 @@ start_ts = time.time()
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%-11.6f %-6d %-16s %1s %s" % ( print("%-11.6f %-6d %-16s %1s %s" % (
time.time() - start_ts, event.pid, event.comm.decode(), time.time() - start_ts, event.pid,
mode_s[event.type], event.filename.decode())) event.comm.decode('utf-8', 'replace'), mode_s[event.type],
event.filename.decode('utf-8', 'replace')))
# header # header
print("%-11s %-6s %-16s %1s %s" % ("TIME(s)", "PID", "COMM", "T", "FILE")) print("%-11s %-6s %-16s %1s %s" % ("TIME(s)", "PID", "COMM", "T", "FILE"))
......
...@@ -314,12 +314,14 @@ def print_event(cpu, data, size): ...@@ -314,12 +314,14 @@ def print_event(cpu, data, size):
if (csv): if (csv):
print("%d,%s,%d,%s,%d,%d,%d,%s" % ( print("%d,%s,%d,%s,%d,%d,%d,%s" % (
event.ts_us, event.task.decode(), event.pid, type, event.size, event.ts_us, event.task.decode('utf-8', 'replace'), event.pid,
event.offset, event.delta_us, event.file.decode())) type, event.size, event.offset, event.delta_us,
event.file.decode('utf-8', 'replace')))
return return
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"), print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
event.task.decode(), event.pid, type, event.size, event.offset / 1024, event.task.decode('utf-8', 'replace'), event.pid, type, event.size,
float(event.delta_us) / 1000, event.file.decode())) event.offset / 1024, float(event.delta_us) / 1000,
event.file.decode('utf-8', 'replace')))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -136,7 +136,8 @@ print("%-8s %-6s %-16s %-7s %s" % ("TIME", "PID", "COMM", "AGE(s)", "FILE")) ...@@ -136,7 +136,8 @@ print("%-8s %-6s %-16s %-7s %s" % ("TIME", "PID", "COMM", "AGE(s)", "FILE"))
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%-8s %-6d %-16s %-7.2f %s" % (strftime("%H:%M:%S"), event.pid, print("%-8s %-6d %-16s %-7.2f %s" % (strftime("%H:%M:%S"), event.pid,
event.comm.decode(), float(event.delta) / 1000, event.fname.decode())) event.comm.decode('utf-8', 'replace'), float(event.delta) / 1000,
event.fname.decode('utf-8', 'replace')))
b["events"].open_perf_buffer(print_event) b["events"].open_perf_buffer(print_event)
while 1: while 1:
......
...@@ -240,13 +240,13 @@ def print_event(cpu, data, size): ...@@ -240,13 +240,13 @@ def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
ms = float(event.delta_us) / 1000 ms = float(event.delta_us) / 1000
name = event.name.decode() name = event.name.decode('utf-8', 'replace')
if event.name_len > DNAME_INLINE_LEN: if event.name_len > DNAME_INLINE_LEN:
name = name[:-3] + "..." name = name[:-3] + "..."
print("%-8.3f %-14.14s %-6s %1s %-7s %7.2f %s" % ( print("%-8.3f %-14.14s %-6s %1s %-7s %7.2f %s" % (
time.time() - start_ts, event.comm.decode(), event.pid, time.time() - start_ts, event.comm.decode('utf-8', 'replace'),
mode_s[event.mode], event.sz, ms, name)) event.pid, mode_s[event.mode], event.sz, ms, name))
b["events"].open_perf_buffer(print_event, page_cnt=64) b["events"].open_perf_buffer(print_event, page_cnt=64)
while 1: while 1:
......
...@@ -190,14 +190,15 @@ while 1: ...@@ -190,14 +190,15 @@ while 1:
for k, v in reversed(sorted(counts.items(), for k, v in reversed(sorted(counts.items(),
key=lambda counts: key=lambda counts:
getattr(counts[1], args.sort))): getattr(counts[1], args.sort))):
name = k.name.decode() name = k.name.decode('utf-8', 'replace')
if k.name_len > DNAME_INLINE_LEN: if k.name_len > DNAME_INLINE_LEN:
name = name[:-3] + "..." name = name[:-3] + "..."
# print line # print line
print("%-6d %-16s %-6d %-6d %-7d %-7d %1s %s" % (k.pid, print("%-6d %-16s %-6d %-6d %-7d %-7d %1s %s" % (k.pid,
k.comm.decode(), v.reads, v.writes, v.rbytes / 1024, k.comm.decode('utf-8', 'replace'), v.reads, v.writes,
v.wbytes / 1024, k.type.decode(), name)) v.rbytes / 1024, v.wbytes / 1024,
k.type.decode('utf-8', 'replace'), name))
line += 1 line += 1
if line >= maxrows: if line >= maxrows:
......
...@@ -306,7 +306,7 @@ def print_stack(event): ...@@ -306,7 +306,7 @@ def print_stack(event):
# print folded stack output # print folded stack output
user_stack = list(user_stack) user_stack = list(user_stack)
kernel_stack = list(kernel_stack) kernel_stack = list(kernel_stack)
line = [event.comm.decode()] + \ line = [event.comm.decode('utf-8', 'replace')] + \
[b.sym(addr, event.tgid_pid) for addr in reversed(user_stack)] + \ [b.sym(addr, event.tgid_pid) for addr in reversed(user_stack)] + \
(do_delimiter and ["-"] or []) + \ (do_delimiter and ["-"] or []) + \
[b.ksym(addr) for addr in reversed(kernel_stack)] [b.ksym(addr) for addr in reversed(kernel_stack)]
...@@ -323,7 +323,7 @@ def print_event(cpu, data, size): ...@@ -323,7 +323,7 @@ def print_event(cpu, data, size):
ts = float(event.duration_ns) / time_multiplier ts = float(event.duration_ns) / time_multiplier
if not args.folded: if not args.folded:
print((time_str(event) + "%-14.14s %-6s %7.2f %16x %s %s") % print((time_str(event) + "%-14.14s %-6s %7.2f %16x %s %s") %
(event.comm.decode(), event.tgid_pid >> 32, (event.comm.decode('utf-8', 'replace'), event.tgid_pid >> 32,
ts, event.retval, args.functions[event.id], args_str(event))) ts, event.retval, args.functions[event.id], args_str(event)))
if args.user_stack or args.kernel_stack: if args.user_stack or args.kernel_stack:
print_stack(event) print_stack(event)
......
...@@ -129,8 +129,8 @@ print("%-9s %-6s %-16s %10s %s" % ("TIME", "PID", "COMM", "LATms", "HOST")) ...@@ -129,8 +129,8 @@ print("%-9s %-6s %-16s %10s %s" % ("TIME", "PID", "COMM", "LATms", "HOST"))
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%-9s %-6d %-16s %10.2f %s" % (strftime("%H:%M:%S"), event.pid, print("%-9s %-6d %-16s %10.2f %s" % (strftime("%H:%M:%S"), event.pid,
event.comm.decode(), (float(event.delta) / 1000000), event.comm.decode('utf-8', 'replace'), (float(event.delta) / 1000000),
event.host.decode())) event.host.decode('utf-8', 'replace')))
# loop with callback to print_event # loop with callback to print_event
b["events"].open_perf_buffer(print_event) b["events"].open_perf_buffer(print_event)
......
...@@ -172,7 +172,7 @@ while (1): ...@@ -172,7 +172,7 @@ while (1):
else: else:
print("%-26s %11s" % ("HARDIRQ", "TOTAL_" + label)) print("%-26s %11s" % ("HARDIRQ", "TOTAL_" + label))
for k, v in sorted(dist.items(), key=lambda dist: dist[1].value): for k, v in sorted(dist.items(), key=lambda dist: dist[1].value):
print("%-26s %11d" % (k.name.decode(), v.value / factor)) print("%-26s %11d" % (k.name.decode('utf-8', 'replace'), v.value / factor))
dist.clear() dist.clear()
countdown -= 1 countdown -= 1
......
...@@ -113,7 +113,7 @@ for (k, v) in b.get_table('ref_count').items(): ...@@ -113,7 +113,7 @@ for (k, v) in b.get_table('ref_count').items():
# This happens on some PIDs due to missed counts caused by sampling # This happens on some PIDs due to missed counts caused by sampling
hit = (v.value - miss) if (v.value >= miss) else 0 hit = (v.value - miss) if (v.value >= miss) else 0
print('{:<8d} {:<16s} {:<4d} {:>12d} {:>12d} {:>6.2f}%'.format( print('{:<8d} {:<16s} {:<4d} {:>12d} {:>12d} {:>6.2f}%'.format(
k.pid, k.name.decode(), k.cpu, v.value, miss, k.pid, k.name.decode('utf-8', 'replace'), k.cpu, v.value, miss,
(float(hit) / float(v.value)) * 100.0)) (float(hit) / float(v.value)) * 100.0))
print('Total References: {} Total Misses: {} Hit Rate: {:.2f}%'.format( print('Total References: {} Total Misses: {} Hit Rate: {:.2f}%'.format(
tot_ref, tot_miss, (float(tot_ref - tot_miss) / float(tot_ref)) * 100.0)) tot_ref, tot_miss, (float(tot_ref - tot_miss) / float(tot_ref)) * 100.0))
...@@ -72,7 +72,8 @@ print("%-8s %-6s %-16s %s" % ("TIME", "PID", "COMM", "DEVICE")) ...@@ -72,7 +72,8 @@ print("%-8s %-6s %-16s %s" % ("TIME", "PID", "COMM", "DEVICE"))
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%-8s %-6d %-16s %s" % (strftime("%H:%M:%S"), event.pid, print("%-8s %-6d %-16s %s" % (strftime("%H:%M:%S"), event.pid,
event.comm.decode(), event.disk.decode())) event.comm.decode('utf-8', 'replace'),
event.disk.decode('utf-8', 'replace')))
# read events # read events
b["events"].open_perf_buffer(print_event) b["events"].open_perf_buffer(print_event)
......
...@@ -382,8 +382,8 @@ def print_event(mounts, umounts, cpu, data, size): ...@@ -382,8 +382,8 @@ def print_event(mounts, umounts, cpu, data, size):
flags=decode_umount_flags(syscall['flags']), flags=decode_umount_flags(syscall['flags']),
retval=decode_errno(event.union.retval)) retval=decode_errno(event.union.retval))
print('{:16} {:<7} {:<7} {:<11} {}'.format( print('{:16} {:<7} {:<7} {:<11} {}'.format(
syscall['comm'].decode(), syscall['tgid'], syscall['pid'], syscall['comm'].decode('utf-8', 'replace'), syscall['tgid'],
syscall['mnt_ns'], call)) syscall['pid'], syscall['mnt_ns'], call))
except KeyError: except KeyError:
# This might happen if we lost an event. # This might happen if we lost an event.
pass pass
......
...@@ -280,13 +280,13 @@ def print_event(cpu, data, size): ...@@ -280,13 +280,13 @@ def print_event(cpu, data, size):
return return
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" %
(strftime("%H:%M:%S"), (strftime("%H:%M:%S"),
event.task.decode(), event.task.decode('utf-8', 'replace'),
event.pid, event.pid,
type, type,
event.size, event.size,
event.offset / 1024, event.offset / 1024,
float(event.delta_us) / 1000, float(event.delta_us) / 1000,
event.file.decode())) event.file.decode('utf-8', 'replace')))
# Currently specifically works for NFSv4, the other kprobes are generic # Currently specifically works for NFSv4, the other kprobes are generic
......
...@@ -281,7 +281,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -281,7 +281,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
# print folded stack output # print folded stack output
user_stack = list(user_stack) user_stack = list(user_stack)
kernel_stack = list(kernel_stack) kernel_stack = list(kernel_stack)
line = [k.name.decode()] line = [k.name.decode('utf-8', 'replace')]
# if we failed to get the stack is, such as due to no space (-ENOMEM) or # if we failed to get the stack is, such as due to no space (-ENOMEM) or
# hash collision (-EEXIST), we still print a placeholder for consistency # hash collision (-EEXIST), we still print a placeholder for consistency
if not args.kernel_stacks_only: if not args.kernel_stacks_only:
...@@ -312,7 +312,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -312,7 +312,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
else: else:
for addr in user_stack: for addr in user_stack:
print(" %s" % b.sym(addr, k.tgid)) print(" %s" % b.sym(addr, k.tgid))
print(" %-16s %s (%d)" % ("-", k.name.decode(), k.pid)) print(" %-16s %s (%d)" % ("-", k.name.decode('utf-8', 'replace'), k.pid))
print(" %d\n" % v.value) print(" %d\n" % v.value)
if missing_stacks > 0: if missing_stacks > 0:
......
...@@ -316,7 +316,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -316,7 +316,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
if folded: if folded:
# print folded stack output # print folded stack output
line = [k.target.decode()] line = [k.target.decode('utf-8', 'replace')]
if not args.kernel_stacks_only: if not args.kernel_stacks_only:
if stack_id_err(k.t_u_stack_id): if stack_id_err(k.t_u_stack_id):
line.append("[Missed User Stack]") line.append("[Missed User Stack]")
...@@ -344,11 +344,11 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -344,11 +344,11 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
else: else:
line.extend([b.sym(addr, k.w_tgid) line.extend([b.sym(addr, k.w_tgid)
for addr in reversed(list(waker_user_stack))]) for addr in reversed(list(waker_user_stack))])
line.append(k.waker.decode()) line.append(k.waker.decode('utf-8', 'replace'))
print("%s %d" % (";".join(line), v.value)) print("%s %d" % (";".join(line), v.value))
else: else:
# print wakeup name then stack in reverse order # print wakeup name then stack in reverse order
print(" %-16s %s %s" % ("waker:", k.waker.decode(), k.t_pid)) print(" %-16s %s %s" % ("waker:", k.waker.decode('utf-8', 'replace'), k.t_pid))
if not args.kernel_stacks_only: if not args.kernel_stacks_only:
if stack_id_err(k.w_u_stack_id): if stack_id_err(k.w_u_stack_id):
print(" [Missed User Stack]") print(" [Missed User Stack]")
...@@ -381,7 +381,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -381,7 +381,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
else: else:
for addr in target_user_stack: for addr in target_user_stack:
print(" %s" % b.sym(addr, k.t_tgid)) print(" %s" % b.sym(addr, k.t_tgid))
print(" %-16s %s %s" % ("target:", k.target.decode(), k.w_pid)) print(" %-16s %s %s" % ("target:", k.target.decode('utf-8', 'replace'), k.w_pid))
print(" %d\n" % v.value) print(" %d\n" % v.value)
if missing_stacks > 0: if missing_stacks > 0:
......
...@@ -185,7 +185,7 @@ while (1): ...@@ -185,7 +185,7 @@ while (1):
for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
if folded: if folded:
# print folded stack output # print folded stack output
line = k.name.decode() + ";" line = k.name.decode('utf-8', 'replace') + ";"
for i in reversed(range(0, maxdepth)): for i in reversed(range(0, maxdepth)):
if k.ret[i] == 0: if k.ret[i] == 0:
continue continue
......
...@@ -68,8 +68,8 @@ def print_event(cpu, data, size): ...@@ -68,8 +68,8 @@ def print_event(cpu, data, size):
avgline = stats.read().rstrip() avgline = stats.read().rstrip()
print(("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\")" print(("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\")"
", %d pages, loadavg: %s") % (strftime("%H:%M:%S"), event.fpid, ", %d pages, loadavg: %s") % (strftime("%H:%M:%S"), event.fpid,
event.fcomm.decode(), event.tpid, event.tcomm.decode(), event.pages, event.fcomm.decode('utf-8', 'replace'), event.tpid,
avgline)) event.tcomm.decode('utf-8', 'replace'), event.pages, avgline))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -339,7 +339,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -339,7 +339,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
# print folded stack output # print folded stack output
user_stack = list(user_stack) user_stack = list(user_stack)
kernel_stack = list(kernel_stack) kernel_stack = list(kernel_stack)
line = [k.name.decode()] + \ line = [k.name.decode('utf-8', 'replace')] + \
[b.sym(addr, k.pid) for addr in reversed(user_stack)] + \ [b.sym(addr, k.pid) for addr in reversed(user_stack)] + \
(do_delimiter and ["-"] or []) + \ (do_delimiter and ["-"] or []) + \
[aksym(addr) for addr in reversed(kernel_stack)] [aksym(addr) for addr in reversed(kernel_stack)]
......
...@@ -199,23 +199,23 @@ while (1): ...@@ -199,23 +199,23 @@ while (1):
for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
if folded: if folded:
# print folded stack output # print folded stack output
line = k.waker.decode() + ";" line = k.waker.decode('utf-8', 'replace') + ";"
for i in reversed(range(0, maxdepth)): for i in reversed(range(0, maxdepth)):
if k.ret[i] == 0: if k.ret[i] == 0:
continue continue
line = line + b.ksym(k.ret[i]) line = line + b.ksym(k.ret[i])
if i != 0: if i != 0:
line = line + ";" line = line + ";"
print("%s;%s %d" % (line, k.target.decode(), v.value)) print("%s;%s %d" % (line, k.target.decode('utf-8', 'replace'), v.value))
else: else:
# print default multi-line stack output # print default multi-line stack output
print(" %-16s %s" % ("target:", k.target.decode())) print(" %-16s %s" % ("target:", k.target.decode('utf-8', 'replace')))
for i in range(0, maxdepth): for i in range(0, maxdepth):
if k.ret[i] == 0: if k.ret[i] == 0:
break break
print(" %-16x %s" % (k.ret[i], print(" %-16x %s" % (k.ret[i],
b.ksym(k.ret[i]))) b.ksym(k.ret[i])))
print(" %-16s %s" % ("waker:", k.waker.decode())) print(" %-16s %s" % ("waker:", k.waker.decode('utf-8', 'replace')))
print(" %d\n" % v.value) print(" %d\n" % v.value)
counts.clear() counts.clear()
......
...@@ -69,8 +69,8 @@ def print_event(cpu, data, size): ...@@ -69,8 +69,8 @@ def print_event(cpu, data, size):
avgline = stats.read().rstrip() avgline = stats.read().rstrip()
print(("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\")" print(("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\")"
", %d pages, loadavg: %s") % (strftime("%H:%M:%S"), event.fpid, ", %d pages, loadavg: %s") % (strftime("%H:%M:%S"), event.fpid,
event.fcomm.decode(), event.tpid, event.tcomm.decode(), event.pages, event.fcomm.decode('utf-8', 'replace'), event.tpid,
avgline)) event.tcomm.decode('utf-8', 'replace'), event.pages, avgline))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -184,7 +184,8 @@ def print_event(cpu, data, size): ...@@ -184,7 +184,8 @@ def print_event(cpu, data, size):
print("%-6d %-16s %4d %3d %s" % print("%-6d %-16s %4d %3d %s" %
(event.id & 0xffffffff if args.tid else event.id >> 32, (event.id & 0xffffffff if args.tid else event.id >> 32,
event.comm.decode(), fd_s, err, event.fname.decode())) event.comm.decode('utf-8', 'replace'), fd_s, err,
event.fname.decode('utf-8', 'replace')))
# loop with callback to print_event # loop with callback to print_event
b["events"].open_perf_buffer(print_event, page_cnt=64) b["events"].open_perf_buffer(print_event, page_cnt=64)
......
...@@ -268,7 +268,7 @@ if not args.folded: ...@@ -268,7 +268,7 @@ if not args.folded:
def aksym(addr): def aksym(addr):
if args.annotations: if args.annotations:
return b.ksym(addr) + "_[k]" return b.ksym(addr) + "_[k]".encode()
else: else:
return b.ksym(addr) return b.ksym(addr)
...@@ -320,7 +320,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -320,7 +320,7 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
line.append("[Missed Kernel Stack]") line.append("[Missed Kernel Stack]")
else: else:
line.extend([b.ksym(addr) for addr in reversed(kernel_stack)]) line.extend([b.ksym(addr) for addr in reversed(kernel_stack)])
print("%s %d" % (b";".join(line).decode(), v.value)) print("%s %d" % (b";".join(line).decode('utf-8', 'replace'), v.value))
else: else:
# print default multi-line stack output # print default multi-line stack output
if not args.user_stacks_only: if not args.user_stacks_only:
...@@ -336,8 +336,8 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value): ...@@ -336,8 +336,8 @@ for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
print(" [Missed User Stack]") print(" [Missed User Stack]")
else: else:
for addr in user_stack: for addr in user_stack:
print(" %s" % b.sym(addr, k.pid).decode()) print(" %s" % b.sym(addr, k.pid).decode('utf-8', 'replace'))
print(" %-16s %s (%d)" % ("-", k.name.decode(), k.pid)) print(" %-16s %s (%d)" % ("-", k.name.decode('utf-8', 'replace'), k.pid))
print(" %d\n" % v.value) print(" %d\n" % v.value)
# check missing # check missing
......
...@@ -221,8 +221,9 @@ def print_event(cpu, data, size, rw): ...@@ -221,8 +221,9 @@ def print_event(cpu, data, size, rw):
" bytes lost) " + "-" * 5 " bytes lost) " + "-" * 5
fmt = "%-12s %-18.9f %-16s %-6d %-6d\n%s\n%s\n%s\n\n" fmt = "%-12s %-18.9f %-16s %-6d %-6d\n%s\n%s\n%s\n\n"
print(fmt % (rw, time_s, event.comm.decode(), event.pid, event.len, s_mark, print(fmt % (rw, time_s, event.comm.decode('utf-8', 'replace'),
event.v0.decode(), e_mark)) event.pid, event.len, s_mark,
event.v0.decode('utf-8', 'replace'), e_mark))
b["perf_SSL_write"].open_perf_buffer(print_event_write) b["perf_SSL_write"].open_perf_buffer(print_event_write)
b["perf_SSL_read"].open_perf_buffer(print_event_read) b["perf_SSL_read"].open_perf_buffer(print_event_read)
......
...@@ -339,7 +339,7 @@ class Tool(object): ...@@ -339,7 +339,7 @@ class Tool(object):
# print folded stack output # print folded stack output
user_stack = list(user_stack) user_stack = list(user_stack)
kernel_stack = list(kernel_stack) kernel_stack = list(kernel_stack)
line = [k.name.decode()] + \ line = [k.name.decode('utf-8', 'replace')] + \
[b.sym(addr, k.tgid) for addr in [b.sym(addr, k.tgid) for addr in
reversed(user_stack)] + \ reversed(user_stack)] + \
(self.need_delimiter and ["-"] or []) + \ (self.need_delimiter and ["-"] or []) + \
......
...@@ -172,8 +172,9 @@ def print_event(cpu, data, size): ...@@ -172,8 +172,9 @@ def print_event(cpu, data, size):
if args.timestamp: if args.timestamp:
print("%-14.9f" % (float(event.ts_ns - start_ts) / 1000000000), end="") print("%-14.9f" % (float(event.ts_ns - start_ts) / 1000000000), end="")
print("%-6d %-16s %4d %3d %s" % (event.pid, event.comm.decode(), print("%-6d %-16s %4d %3d %s" % (event.pid,
fd_s, err, event.fname.decode())) event.comm.decode('utf-8', 'replace'), fd_s, err,
event.fname.decode('utf-8', 'replace')))
# loop with callback to print_event # loop with callback to print_event
b["events"].open_perf_buffer(print_event, page_cnt=64) b["events"].open_perf_buffer(print_event, page_cnt=64)
......
...@@ -239,7 +239,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -239,7 +239,7 @@ def print_ipv4_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid,
event.task.decode(), event.ip, event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET, pack("I", event.daddr)), inet_ntop(AF_INET, pack("I", event.daddr)),
inet_ntop(AF_INET, pack("I", event.saddr)), event.lport)) inet_ntop(AF_INET, pack("I", event.saddr)), event.lport))
...@@ -251,8 +251,9 @@ def print_ipv6_event(cpu, data, size): ...@@ -251,8 +251,9 @@ def print_ipv6_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid,
event.task.decode(), event.ip, inet_ntop(AF_INET6, event.daddr), event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET6, event.saddr), event.lport)) inet_ntop(AF_INET6, event.daddr),inet_ntop(AF_INET6, event.saddr),
event.lport))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -202,7 +202,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -202,7 +202,7 @@ def print_ipv4_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid,
event.task.decode(), event.ip, event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET, pack("I", event.saddr)), inet_ntop(AF_INET, pack("I", event.saddr)),
inet_ntop(AF_INET, pack("I", event.daddr)), event.dport)) inet_ntop(AF_INET, pack("I", event.daddr)), event.dport))
...@@ -214,8 +214,9 @@ def print_ipv6_event(cpu, data, size): ...@@ -214,8 +214,9 @@ def print_ipv6_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-4d" % (event.pid,
event.task.decode(), event.ip, inet_ntop(AF_INET6, event.saddr), event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET6, event.daddr), event.dport)) inet_ntop(AF_INET6, event.saddr), inet_ntop(AF_INET6, event.daddr),
event.dport))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
...@@ -237,7 +237,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -237,7 +237,7 @@ def print_ipv4_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f" % (event.pid,
event.task.decode(), event.ip, event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET, pack("I", event.saddr)), inet_ntop(AF_INET, pack("I", event.saddr)),
inet_ntop(AF_INET, pack("I", event.daddr)), event.dport, inet_ntop(AF_INET, pack("I", event.daddr)), event.dport,
float(event.delta_us) / 1000)) float(event.delta_us) / 1000))
...@@ -250,9 +250,9 @@ def print_ipv6_event(cpu, data, size): ...@@ -250,9 +250,9 @@ def print_ipv6_event(cpu, data, size):
start_ts = event.ts_us start_ts = event.ts_us
print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="") print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
print("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f" % (event.pid, print("%-6d %-12.12s %-2d %-16s %-16s %-5d %.2f" % (event.pid,
event.task.decode(), event.ip, inet_ntop(AF_INET6, event.saddr), event.task.decode('utf-8', 'replace'), event.ip,
inet_ntop(AF_INET6, event.daddr), event.dport, inet_ntop(AF_INET6, event.saddr), inet_ntop(AF_INET6, event.daddr),
float(event.delta_us) / 1000)) event.dport, float(event.delta_us) / 1000))
# header # header
if args.timestamp: if args.timestamp:
......
...@@ -454,7 +454,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -454,7 +454,7 @@ def print_ipv4_event(cpu, data, size):
print("%.6f," % delta_s, end="") print("%.6f," % delta_s, end="")
else: else:
print("%-9.6f " % delta_s, end="") print("%-9.6f " % delta_s, end="")
print(format_string % (event.pid, event.task.decode(), print(format_string % (event.pid, event.task.decode('utf-8', 'replace'),
"4" if args.wide or args.csv else "", "4" if args.wide or args.csv else "",
inet_ntop(AF_INET, pack("I", event.saddr)), event.ports >> 32, inet_ntop(AF_INET, pack("I", event.saddr)), event.ports >> 32,
inet_ntop(AF_INET, pack("I", event.daddr)), event.ports & 0xffffffff, inet_ntop(AF_INET, pack("I", event.daddr)), event.ports & 0xffffffff,
...@@ -476,7 +476,7 @@ def print_ipv6_event(cpu, data, size): ...@@ -476,7 +476,7 @@ def print_ipv6_event(cpu, data, size):
print("%.6f," % delta_s, end="") print("%.6f," % delta_s, end="")
else: else:
print("%-9.6f " % delta_s, end="") print("%-9.6f " % delta_s, end="")
print(format_string % (event.pid, event.task.decode(), print(format_string % (event.pid, event.task.decode('utf-8', 'replace'),
"6" if args.wide or args.csv else "", "6" if args.wide or args.csv else "",
inet_ntop(AF_INET6, event.saddr), event.ports >> 32, inet_ntop(AF_INET6, event.saddr), event.ports >> 32,
inet_ntop(AF_INET6, event.daddr), event.ports & 0xffffffff, inet_ntop(AF_INET6, event.daddr), event.ports & 0xffffffff,
......
...@@ -276,7 +276,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -276,7 +276,7 @@ def print_ipv4_event(cpu, data, size):
print("%.6f," % delta_s, end="") print("%.6f," % delta_s, end="")
else: else:
print("%-9.6f " % delta_s, end="") print("%-9.6f " % delta_s, end="")
print(format_string % (event.skaddr, event.pid, event.task.decode(), print(format_string % (event.skaddr, event.pid, event.task.decode('utf-8', 'replace'),
"4" if args.wide or args.csv else "", "4" if args.wide or args.csv else "",
inet_ntop(AF_INET, pack("I", event.saddr)), event.ports >> 32, inet_ntop(AF_INET, pack("I", event.saddr)), event.ports >> 32,
inet_ntop(AF_INET, pack("I", event.daddr)), event.ports & 0xffffffff, inet_ntop(AF_INET, pack("I", event.daddr)), event.ports & 0xffffffff,
...@@ -299,7 +299,7 @@ def print_ipv6_event(cpu, data, size): ...@@ -299,7 +299,7 @@ def print_ipv6_event(cpu, data, size):
print("%.6f," % delta_s, end="") print("%.6f," % delta_s, end="")
else: else:
print("%-9.6f " % delta_s, end="") print("%-9.6f " % delta_s, end="")
print(format_string % (event.skaddr, event.pid, event.task.decode(), print(format_string % (event.skaddr, event.pid, event.task.decode('utf-8', 'replace'),
"6" if args.wide or args.csv else "", "6" if args.wide or args.csv else "",
inet_ntop(AF_INET6, event.saddr), event.ports >> 32, inet_ntop(AF_INET6, event.saddr), event.ports >> 32,
inet_ntop(AF_INET6, event.daddr), event.ports & 0xffffffff, inet_ntop(AF_INET6, event.daddr), event.ports & 0xffffffff,
......
...@@ -556,7 +556,7 @@ def print_ipv4_event(cpu, data, size): ...@@ -556,7 +556,7 @@ def print_ipv4_event(cpu, data, size):
print("%-2s " % (type_str), end="") print("%-2s " % (type_str), end="")
print("%-6d %-16s %-2d %-16s %-16s %-6d %-6d" % print("%-6d %-16s %-2d %-16s %-16s %-6d %-6d" %
(event.pid, event.comm.decode('utf-8'), (event.pid, event.comm.decode('utf-8', 'replace'),
event.ip, event.ip,
inet_ntop(AF_INET, pack("I", event.saddr)), inet_ntop(AF_INET, pack("I", event.saddr)),
inet_ntop(AF_INET, pack("I", event.daddr)), inet_ntop(AF_INET, pack("I", event.daddr)),
...@@ -593,7 +593,7 @@ def print_ipv6_event(cpu, data, size): ...@@ -593,7 +593,7 @@ def print_ipv6_event(cpu, data, size):
print("%-2s " % (type_str), end="") print("%-2s " % (type_str), end="")
print("%-6d %-16s %-2d %-16s %-16s %-6d %-6d" % print("%-6d %-16s %-2d %-16s %-16s %-6d %-6d" %
(event.pid, event.comm.decode('utf-8'), (event.pid, event.comm.decode('utf-8', 'replace'),
event.ip, event.ip,
"[" + inet_ntop(AF_INET6, event.saddr) + "]", "[" + inet_ntop(AF_INET6, event.saddr) + "]",
"[" + inet_ntop(AF_INET6, event.daddr) + "]", "[" + inet_ntop(AF_INET6, event.daddr) + "]",
......
...@@ -558,7 +558,8 @@ BPF_PERF_OUTPUT(%s); ...@@ -558,7 +558,8 @@ BPF_PERF_OUTPUT(%s);
if Probe.print_cpu: if Probe.print_cpu:
print("%-3s " % event.cpu, end="") print("%-3s " % event.cpu, end="")
print("%-7d %-7d %-15s %-16s %s" % print("%-7d %-7d %-15s %-16s %s" %
(event.tgid, event.pid, event.comm.decode(), (event.tgid, event.pid,
event.comm.decode('utf-8', 'replace'),
self._display_function(), msg)) self._display_function(), msg))
if self.kernel_stack: if self.kernel_stack:
......
...@@ -115,7 +115,7 @@ if not args.noclear: ...@@ -115,7 +115,7 @@ if not args.noclear:
# process event # process event
def print_event(cpu, data, size): def print_event(cpu, data, size):
event = ct.cast(data, ct.POINTER(Data)).contents event = ct.cast(data, ct.POINTER(Data)).contents
print("%s" % event.buf[0:event.count].decode(), end="") print("%s" % event.buf[0:event.count].decode('utf-8', 'replace'), end="")
sys.stdout.flush() sys.stdout.flush()
# loop with callback to print_event # loop with callback to print_event
......
...@@ -265,12 +265,14 @@ def print_event(cpu, data, size): ...@@ -265,12 +265,14 @@ def print_event(cpu, data, size):
if (csv): if (csv):
print("%d,%s,%d,%s,%d,%d,%d,%s" % ( print("%d,%s,%d,%s,%d,%d,%d,%s" % (
event.ts_us, event.task.decode(), event.pid, type, event.size, event.ts_us, event.task.decode('utf-8', 'replace'), event.pid,
event.offset, event.delta_us, event.file.decode())) type, event.size, event.offset, event.delta_us,
event.file.decode('utf-8', 'replace')))
return return
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"), print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
event.task.decode(), event.pid, type, event.size, event.offset / 1024, event.task.decode('utf-8', 'replace'), event.pid, type, event.size,
float(event.delta_us) / 1000, event.file.decode())) event.offset / 1024, float(event.delta_us) / 1000,
event.file.decode('utf-8', 'replace')))
# initialize BPF # initialize BPF
b = BPF(text=bpf_text) b = BPF(text=bpf_text)
......
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