Skip to content
  • Wang Nan's avatar
    perf ctf: Convert invalid chars in a string before set value · 5ea5888b
    Wang Nan authored
    
    
    We observed some crazy apps on Android set their comm to unprintable
    string. For example:
    
      # cat /proc/10607/task/*/comm
      tencent.qqmusic
      ...
      Binder_2
      日志输出线  <-- Chinese word 'log output thread'
      WifiManager
      ...
    
    'perf data convert' fails to convert perf.data with such string to CTF format.
    
    For example:
    
      # cat << EOF > ./badguy.c
      #include <sys/prctl.h>
      int main(int argc, char *argv[])
      {
             prctl(PR_SET_NAME, "\xe6\x97\xa5\xe5\xbf\x97\xe8\xbe\x93\xe5\x87\xba\xe7\xba\xbf");
             while(1)
                     sleep(1);
             return 0;
      }
      EOF
      # gcc ./badguy.c
      # perf record -e sched:* ./a.out
      # perf data convert --to-ctf ./bad.ctf
      CTF stream 4 flush failed
      [ perf data convert: Converted 'perf.data' into CTF data './bad.ctf' ]
      [ perf data convert: Converted and wrote 0.008 MB (78 samples)  ]
      # babeltrace ./bad.ctf/
      [error] Packet size (18446744073709551615 bits) is larger than remaining file size (262144 bits).
      [error] Stream index creation error.
      [error] Open file stream error.
      [warning] [Context] Cannot open_trace of format ctf at path ./bad.ctf.
      [warning] [Context] cannot open trace "./bad.ctf" from ./bad.ctf/ for reading.
      [error] Cannot open any trace for reading.
    
      [error] opening trace "./bad.ctf/" for reading.
    
      [error] none of the specified trace paths could be opened.
    
    This patch converts unprintable characters to hexadecimal word.
    
    After applying this patch the above test works correctly:
    
      # ~/perf data convert --to-ctf ./good.ctf
      [ perf data convert: Converted 'perf.data' into CTF data './good.ctf' ]
      [ perf data convert: Converted and wrote 0.008 MB (78 samples) ]
      # babeltrace ./good.ctf
      ..
      [23:14:35.491665268] (+0.000001100) sched:sched_wakeup: { cpu_id = 4 }, { perf_ip = 0xFFFFFFFF810AEF33, perf_tid = 0, perf_pid = 0, perf_id = 5123, perf_period = 1, common_type = 270, common_flags = 45, common_preempt_count = 4, common_pid = 0, comm = "\xe6\x97\xa5\xe5\xbf\x97\xe8\xbe\x93\xe5\x87\xba\xe7\xba\xbf", pid = 1057, prio = 120, success = 1, target_cpu = 4 }
      [23:14:35.491666230] (+0.000000962) sched:sched_wakeup: { cpu_id = 4 }, { perf_ip = 0xFFFFFFFF810AEF33, perf_tid = 0, perf_pid = 0, perf_id = 5122, perf_period = 1, common_type = 270, common_flags = 45, common_preempt_count = 4, common_pid = 0, comm = "\xe6\x97\xa5\xe5\xbf\x97\xe8\xbe\x93\xe5\x87\xba\xe7\xba\xbf", pid = 1057, prio = 120, success = 1, target_cpu = 4 }
      ..
    
    Committer note:
    
    To build perf with libabeltrace, use:
    
      $ mkdir -p /tmp/build/perf
      $ make LIBBABELTRACE=1 LIBBABELTRACE_DIR=/usr/local O=/tmp/build/perf -C tools/perf install-bin
    
    Or equivalent (no O=, fixup LIBBABELTRACE_DIR, etc).
    
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1464348951-179595-1-git-send-email-wangnan0@huawei.com
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    5ea5888b