trace_btf_general.sh 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/bin/bash
  2. # perf trace BTF general tests
  3. # SPDX-License-Identifier: GPL-2.0
  4. err=0
  5. # shellcheck source=lib/probe.sh
  6. . "$(dirname $0)"/lib/probe.sh
  7. file1=$(mktemp /tmp/file1_XXXX)
  8. file2=$(echo $file1 | sed 's/file1/file2/g')
  9. buffer="buffer content"
  10. perf_config_tmp=$(mktemp /tmp/.perfconfig_XXXXX)
  11. trap cleanup EXIT TERM INT HUP
  12. check_vmlinux() {
  13. echo "Checking if vmlinux BTF exists"
  14. if [ ! -f /sys/kernel/btf/vmlinux ]
  15. then
  16. echo "Skipped due to missing vmlinux BTF"
  17. return 2
  18. fi
  19. return 0
  20. }
  21. trace_test_string() {
  22. echo "Testing perf trace's string augmentation"
  23. output="$(perf trace --sort-events -e renameat* --max-events=1 -- mv ${file1} ${file2} 2>&1)"
  24. if ! echo "$output" | grep -q -E "^mv/[0-9]+ renameat(2)?\(.*, \"${file1}\", .*, \"${file2}\", .*\) += +[0-9]+$"
  25. then
  26. printf "String augmentation test failed, output:\n$output\n"
  27. err=1
  28. fi
  29. }
  30. trace_test_buffer() {
  31. echo "Testing perf trace's buffer augmentation"
  32. # echo will insert a newline (\10) at the end of the buffer
  33. output="$(perf trace --sort-events -e write --max-events=1 -- echo "${buffer}" 2>&1)"
  34. if ! echo "$output" | grep -q -E "^echo/[0-9]+ write\([0-9]+, ${buffer}.*, [0-9]+\) += +[0-9]+$"
  35. then
  36. printf "Buffer augmentation test failed, output:\n$output\n"
  37. err=1
  38. fi
  39. }
  40. trace_test_struct_btf() {
  41. echo "Testing perf trace's struct augmentation"
  42. output="$(perf trace --sort-events -e clock_nanosleep --force-btf --max-events=1 -- sleep 1 2>&1)"
  43. if ! echo "$output" | grep -q -E "^sleep/[0-9]+ clock_nanosleep\(0, 0, \{1,.*\}, 0x[0-9a-f]+\) += +[0-9]+$"
  44. then
  45. printf "BTF struct augmentation test failed, output:\n$output\n"
  46. err=1
  47. fi
  48. }
  49. cleanup() {
  50. rm -rf ${file1} ${file2} ${perf_config_tmp}
  51. }
  52. trap_cleanup() {
  53. echo "Unexpected signal in ${FUNCNAME[1]}"
  54. cleanup
  55. exit 1
  56. }
  57. # don't overwrite user's perf config
  58. trace_config() {
  59. export PERF_CONFIG=${perf_config_tmp}
  60. perf config trace.show_arg_names=false trace.show_duration=false \
  61. trace.show_timestamp=false trace.args_alignment=0
  62. }
  63. skip_if_no_perf_trace || exit 2
  64. check_vmlinux || exit 2
  65. [ "$(id -u)" = 0 ] || exit 2
  66. trace_config
  67. trace_test_string
  68. if [ $err = 0 ]; then
  69. trace_test_buffer
  70. fi
  71. if [ $err = 0 ]; then
  72. trace_test_struct_btf
  73. fi
  74. cleanup
  75. exit $err