Skip to content

Commit b96ebcd

Browse files
jeromemarchandyonghong-song
authored andcommitted
Bytes/string encoding (iovisor#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()
1 parent ec3fe90 commit b96ebcd

39 files changed

Lines changed: 100 additions & 84 deletions

tools/bashreadline.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class Data(ct.Structure):
5757
def print_event(cpu, data, size):
5858
event = ct.cast(data, ct.POINTER(Data)).contents
5959
print("%-9s %-6d %s" % (strftime("%H:%M:%S"), event.pid,
60-
event.str.decode()))
60+
event.str.decode('utf-8', 'replace')))
6161

6262
b["events"].open_perf_buffer(print_event)
6363
while 1:

tools/biosnoop.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ def print_event(cpu, data, size):
176176
delta = float(delta) + (event.ts - prev_ts)
177177

178178
print("%-14.9f %-14.14s %-6s %-7s %-2s %-9s %-7s %7.2f" % (
179-
delta / 1000000, event.name.decode(), event.pid,
180-
event.disk_name.decode(), rwflg, val,
179+
delta / 1000000, event.name.decode('utf-8', 'replace'), event.pid,
180+
event.disk_name.decode('utf-8', 'replace'), rwflg, val,
181181
event.len, float(event.delta) / 1000000))
182182

183183
prev_ts = event.ts

tools/biotop.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ def signal_ignore(signal, frame):
221221
# print line
222222
avg_ms = (float(v.us) / 1000) / v.io
223223
print("%-6d %-16s %1s %-3d %-3d %-8s %5s %7s %6.2f" % (k.pid,
224-
k.name.decode(), "W" if k.rwflag else "R", k.major, k.minor,
225-
diskname, v.io, v.bytes / 1024, avg_ms))
224+
k.name.decode('utf-8', 'replace'), "W" if k.rwflag else "R",
225+
k.major, k.minor, diskname, v.io, v.bytes / 1024, avg_ms))
226226

227227
line += 1
228228
if line >= maxrows:

tools/btrfsslower.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,14 @@ def print_event(cpu, data, size):
316316

317317
if (csv):
318318
print("%d,%s,%d,%s,%d,%d,%d,%s" % (
319-
event.ts_us, event.task.decode(), event.pid, type, event.size,
320-
event.offset, event.delta_us, event.file.decode()))
319+
event.ts_us, event.task.decode('utf-8', 'replace'), event.pid,
320+
type, event.size, event.offset, event.delta_us,
321+
event.file.decode('utf-8', 'replace')))
321322
return
322323
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
323-
event.task.decode(), event.pid, type, event.size, event.offset / 1024,
324-
float(event.delta_us) / 1000, event.file.decode()))
324+
event.task.decode('utf-8', 'replace'), event.pid, type, event.size,
325+
event.offset / 1024, float(event.delta_us) / 1000,
326+
event.file.decode('utf-8', 'replace')))
325327

326328
# initialize BPF
327329
b = BPF(text=bpf_text)

tools/cachetop.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def get_processes_stats(
7272
counts = bpf.get_table("counts")
7373
stats = defaultdict(lambda: defaultdict(int))
7474
for k, v in counts.items():
75-
stats["%d-%d-%s" % (k.pid, k.uid, k.comm.decode())][k.ip] = v.value
75+
stats["%d-%d-%s" % (k.pid, k.uid, k.comm.decode('utf-8', 'replace'))][k.ip] = v.value
7676
stats_list = []
7777

7878
for pid, count in sorted(stats.items(), key=lambda stat: stat[0]):

tools/capable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ def print_event(cpu, data, size):
148148
else:
149149
name = "?"
150150
print("%-9s %-6d %-6d %-16s %-4d %-20s %d" % (strftime("%H:%M:%S"),
151-
event.uid, event.pid, event.comm.decode(), event.cap, name,
152-
event.audit))
151+
event.uid, event.pid, event.comm.decode('utf-8', 'replace'),
152+
event.cap, name, event.audit))
153153

154154
# loop with callback to print_event
155155
b["events"].open_perf_buffer(print_event)

tools/dcsnoop.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,9 @@ class Data(ct.Structure):
153153
def print_event(cpu, data, size):
154154
event = ct.cast(data, ct.POINTER(Data)).contents
155155
print("%-11.6f %-6d %-16s %1s %s" % (
156-
time.time() - start_ts, event.pid, event.comm.decode(),
157-
mode_s[event.type], event.filename.decode()))
156+
time.time() - start_ts, event.pid,
157+
event.comm.decode('utf-8', 'replace'), mode_s[event.type],
158+
event.filename.decode('utf-8', 'replace')))
158159

159160
# header
160161
print("%-11s %-6s %-16s %1s %s" % ("TIME(s)", "PID", "COMM", "T", "FILE"))

tools/ext4slower.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,14 @@ def print_event(cpu, data, size):
314314

315315
if (csv):
316316
print("%d,%s,%d,%s,%d,%d,%d,%s" % (
317-
event.ts_us, event.task.decode(), event.pid, type, event.size,
318-
event.offset, event.delta_us, event.file.decode()))
317+
event.ts_us, event.task.decode('utf-8', 'replace'), event.pid,
318+
type, event.size, event.offset, event.delta_us,
319+
event.file.decode('utf-8', 'replace')))
319320
return
320321
print("%-8s %-14.14s %-6s %1s %-7s %-8d %7.2f %s" % (strftime("%H:%M:%S"),
321-
event.task.decode(), event.pid, type, event.size, event.offset / 1024,
322-
float(event.delta_us) / 1000, event.file.decode()))
322+
event.task.decode('utf-8', 'replace'), event.pid, type, event.size,
323+
event.offset / 1024, float(event.delta_us) / 1000,
324+
event.file.decode('utf-8', 'replace')))
323325

324326
# initialize BPF
325327
b = BPF(text=bpf_text)

tools/filelife.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ class Data(ct.Structure):
136136
def print_event(cpu, data, size):
137137
event = ct.cast(data, ct.POINTER(Data)).contents
138138
print("%-8s %-6d %-16s %-7.2f %s" % (strftime("%H:%M:%S"), event.pid,
139-
event.comm.decode(), float(event.delta) / 1000, event.fname.decode()))
139+
event.comm.decode('utf-8', 'replace'), float(event.delta) / 1000,
140+
event.fname.decode('utf-8', 'replace')))
140141

141142
b["events"].open_perf_buffer(print_event)
142143
while 1:

tools/fileslower.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,13 @@ def print_event(cpu, data, size):
240240
event = ct.cast(data, ct.POINTER(Data)).contents
241241

242242
ms = float(event.delta_us) / 1000
243-
name = event.name.decode()
243+
name = event.name.decode('utf-8', 'replace')
244244
if event.name_len > DNAME_INLINE_LEN:
245245
name = name[:-3] + "..."
246246

247247
print("%-8.3f %-14.14s %-6s %1s %-7s %7.2f %s" % (
248-
time.time() - start_ts, event.comm.decode(), event.pid,
249-
mode_s[event.mode], event.sz, ms, name))
248+
time.time() - start_ts, event.comm.decode('utf-8', 'replace'),
249+
event.pid, mode_s[event.mode], event.sz, ms, name))
250250

251251
b["events"].open_perf_buffer(print_event, page_cnt=64)
252252
while 1:

0 commit comments

Comments
 (0)