Skip to content

Instantly share code, notes, and snippets.

@trishume
Created September 11, 2023 05:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trishume/0384b1f65e8cf6802aba01e2480d8a77 to your computer and use it in GitHub Desktop.
Save trishume/0384b1f65e8cf6802aba01e2480d8a77 to your computer and use it in GitHub Desktop.
perf script to chrome trace
#!/bin/bash
set -eu
TIMESTAMP=`date '+%Y-%m-%d-%H:%M:%S'`;
perf buildid-cache --add /usr/local/lib/librfxencode.so.0
perf buildid-cache --add /usr/local/lib/xrdp/libxrdp.so.0
perf buildid-cache --add /usr/lib/xorg/modules/libxorgxrdp.so
perf buildid-cache --add `which xrdp`
perf probe --del 'sdt_librfxcodec:*' || true
perf probe sdt_librfxcodec:rfx_compose_message_tileset_start
perf probe sdt_librfxcodec:rfx_compose_message_tileset_tile
perf probe sdt_librfxcodec:rfx_compose_message_tileset_end
perf probe sdt_librfxcodec:process_enc_rfx_send
perf probe --del 'sdt_libxrdp:*' || true
perf probe sdt_libxrdp:xrdp_rdp_send_fastpath
perf probe sdt_libxrdp:xrdp_rdp_send_fastpath_compratio
perf probe --del 'sdt_xorgxrdp:*' || true
perf probe sdt_xorgxrdp:rdpCapture2
perf probe sdt_xorgxrdp:rdpCapture2_firstrows
perf probe sdt_xorgxrdp:rdpCapture2_scrolldet
perf probe sdt_xorgxrdp:rdpCapture2_scrollmap
perf probe sdt_xorgxrdp:rdpCapture2_scrollextentx
perf probe sdt_xorgxrdp:rdpCapture2_scrollextenty
perf probe sdt_xorgxrdp:rdpCapture2_scrolled
perf probe sdt_xorgxrdp:rdpPutImage
perf probe --del 'probe_librfxencode:*' || true
perf probe -x /usr/local/lib/librfxencode.so.0 'rfxcodec_encode+0'
perf probe -x /usr/local/lib/librfxencode.so.0 'rfxcodec_encode%return'
perf probe --del 'probe_libxrdp:*' || true
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_process_input_event+0'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_process_input_event%return'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'compress_rdp+0'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'compress_rdp%return'
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_fastpath+0'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_fastpath%return'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_data+0'
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_data%return'
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_send+0'
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_send%return'
perf probe --del 'probe_libcommon:*' || true
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tcp_send+0'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tcp_send%return'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tls_send+0'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tls_send%return'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_set_tls_mode+0'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_set_tls_mode%return'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_shutdown_tls_mode+0'
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_shutdown_tls_mode%return'
perf probe --del 'probe_libxorgxrdp:*' || true
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCapture+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCapture%return'
# perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPutImage+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPutImage%return'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddAllReg+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddAllBox+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddDirtyScreenBox+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddDirtyScreenReg+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCopyArea+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCopyArea%return'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCompositeRects+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCompositeRects%return'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPolyFillRect+0'
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPolyFillRect%return'
# exit 0
DIR=~/perf/xrdp-${TIMESTAMP}
echo $DIR
mkdir $DIR
cd $DIR
ctrl_c() {
echo "cleaning up"
rm ~/perf/latest
ln -s $DIR ~/perf/latest
chown -R $SUDO_USER ~/perf
exit
}
trap ctrl_c INT TERM
perf record -e 'sdt_librfxcodec:*,sdt_libxrdp:*,sdt_xorgxrdp:*,probe_librfxencode:*,probe_libxrdp:*,probe_libxorgxrdp:*,probe_libcommon:*,sched:sched_switch' -a
require "json"
REGEX = /^\s*(?<proc>\S+)\s+(?<tid>-?[0-9]+) \[(?<cpu>[0-9]+)\]\s+(?<time>[0-9]+\.[0-9]+):\s+(?<cat>\S+):(?<event>\S+?)(?:_start|)(?<end>__return|_end|): (?:\(.*\)(?: |$))?(?<args>.*)$/
evs = []
ARGF.each_line do |line|
# puts line
line = line.gsub("JS Helper", "JSHelper")
line = line.gsub("Bluez D-Bus thr", "BluezDbusthr")
line = line.gsub("dconf worker", "dconfworker")
line = line.gsub("rs:main Q:Reg", "dconfworker")
if m = line.match(REGEX)
# p m
evs << m
else
STDERR.puts "no match: #{line.inspect}"
exit 1
end
end
# END_REGEX = /(?:__return|_end)$/
spans = {}
evs.each do |m|
if m[:end] != ""
spans[m[:event]] = true
end
end
$started = false
$opened = {}
def print_ev(e)
return if e[:name].include?('swapper')
if e[:ph] == 'E' && !$opened[e[:tid]]
return
elsif e[:ph] == 'B'
$opened[e[:tid]] = true
end
if $started
print ","
else
$started = true
end
puts JSON.dump(e)
end
puts "["
evs.each do |m|
ts = (m[:time].to_f*1_000_000).to_i
if m[:event] == "sched_switch"
if a = m[:args].match(/^prev_comm=(?<from>\S+) .* next_comm=(?<to>\S+) /)
# p [m[:cpu].to_i, a[:from], a[:to]]
e1 = {'name': a[:from], 'cat': 'cpu', 'ph': 'E', 'ts': ts, 'pid': 0, 'tid': m[:cpu].to_i, "args": {}}
e2 = {'name': a[:to], 'cat': 'cpu', 'ph': 'B', 'ts': ts, 'pid': 0, 'tid': m[:cpu].to_i, "args": {}}
print_ev(e1)
print_ev(e2)
else
p ["not matched", m[:args]]
end
else
ph = 'I'
if m[:end] != ""
ph = 'E'
elsif spans[m[:event]]
ph = 'B'
end
# n = m[:event].gsub(/^\S+:/,'')
n = m[:event]
args = m[:args].empty? ? {} : { ph => m[:args]}
e = {'name': n, 'cat': m[:proc], 'ph': ph, 'ts': ts, 'pid': 1, 'tid': m[:tid].to_i, "args": args}
print_ev(e)
end
end
puts "]"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment