crosstap 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #!/bin/bash
  2. #
  3. # Run a systemtap script on remote target
  4. #
  5. # Examples (run on build host, target is 192.168.1.xxx):
  6. # $ source oe-init-build-env"
  7. # $ cd ~/my/systemtap/scripts"
  8. #
  9. # $ crosstap root@192.168.1.xxx myscript.stp"
  10. # $ crosstap root@192.168.1.xxx myscript-with-args.stp 99 ninetynine"
  11. #
  12. # Copyright (c) 2012, Intel Corporation.
  13. # All rights reserved.
  14. #
  15. # This program is free software; you can redistribute it and/or modify
  16. # it under the terms of the GNU General Public License version 2 as
  17. # published by the Free Software Foundation.
  18. #
  19. # This program is distributed in the hope that it will be useful,
  20. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  22. # See the GNU General Public License for more details.
  23. #
  24. # You should have received a copy of the GNU General Public License
  25. # along with this program; if not, write to the Free Software
  26. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  27. function usage() {
  28. echo "Usage: $0 <user@hostname> <sytemtap-script> [additional systemtap-script args]"
  29. }
  30. function setup_usage() {
  31. echo ""
  32. echo "'crosstap' requires a local sdk build of the target system"
  33. echo "(or a build that includes 'tools-profile') in order to build"
  34. echo "kernel modules that can probe the target system."
  35. echo ""
  36. echo "Practically speaking, that means you need to do the following:"
  37. echo " - If you're running a pre-built image, download the release"
  38. echo " and/or BSP tarballs used to build the image."
  39. echo " - If you're working from git sources, just clone the metadata"
  40. echo " and BSP layers needed to build the image you'll be booting."
  41. echo " - Make sure you're properly set up to build a new image (see"
  42. echo " the BSP README and/or the widely available basic documentation"
  43. echo " that discusses how to build images)."
  44. echo " - Build an -sdk version of the image e.g.:"
  45. echo " $ bitbake core-image-sato-sdk"
  46. echo " OR"
  47. echo " - Build a non-sdk image but include the profiling tools:"
  48. echo " [ edit local.conf and add 'tools-profile' to the end of"
  49. echo " the EXTRA_IMAGE_FEATURES variable ]"
  50. echo " $ bitbake core-image-sato"
  51. echo ""
  52. echo " [ NOTE that 'crosstap' needs to be able to ssh into the target"
  53. echo " system, which isn't enabled by default in -minimal images. ]"
  54. echo ""
  55. echo "Once you've build the image on the host system, you're ready to"
  56. echo "boot it (or the equivalent pre-built image) and use 'crosstap'"
  57. echo "to probe it (you need to source the environment as usual first):"
  58. echo ""
  59. echo " $ source oe-init-build-env"
  60. echo " $ cd ~/my/systemtap/scripts"
  61. echo " $ crosstap root@192.168.1.xxx myscript.stp"
  62. echo ""
  63. }
  64. function systemtap_target_arch() {
  65. SYSTEMTAP_TARGET_ARCH=$1
  66. case $SYSTEMTAP_TARGET_ARCH in
  67. i?86)
  68. SYSTEMTAP_TARGET_ARCH="i386"
  69. ;;
  70. x86?64*)
  71. SYSTEMTAP_TARGET_ARCH="x86_64"
  72. ;;
  73. arm*)
  74. SYSTEMTAP_TARGET_ARCH="arm"
  75. ;;
  76. powerpc*)
  77. SYSTEMTAP_TARGET_ARCH="powerpc"
  78. ;;
  79. *)
  80. ;;
  81. esac
  82. }
  83. if [ $# -lt 2 ]; then
  84. usage
  85. exit 1
  86. fi
  87. if [ -z "$BUILDDIR" ]; then
  88. echo "Error: Unable to find the BUILDDIR environment variable."
  89. echo "Did you forget to source your build system environment setup script?"
  90. exit 1
  91. fi
  92. pushd $PWD
  93. cd $BUILDDIR
  94. BITBAKE_VARS=`bitbake -e virtual/kernel`
  95. popd
  96. STAGING_BINDIR_TOOLCHAIN=$(echo "$BITBAKE_VARS" | grep ^STAGING_BINDIR_TOOLCHAIN \
  97. | cut -d '=' -f2 | cut -d '"' -f2)
  98. STAGING_BINDIR_TOOLPREFIX=$(echo "$BITBAKE_VARS" | grep ^TARGET_PREFIX \
  99. | cut -d '=' -f2 | cut -d '"' -f2)
  100. TARGET_ARCH=$(echo "$BITBAKE_VARS" | grep ^TRANSLATED_TARGET_ARCH \
  101. | cut -d '=' -f2 | cut -d '"' -f2)
  102. TARGET_KERNEL_BUILDDIR=$(echo "$BITBAKE_VARS" | grep ^B= \
  103. | cut -d '=' -f2 | cut -d '"' -f2)
  104. # Build and populate the recipe-sysroot-native with systemtap-native
  105. pushd $PWD
  106. cd $BUILDDIR
  107. BITBAKE_VARS=`bitbake -e systemtap-native`
  108. popd
  109. SYSTEMTAP_HOST_INSTALLDIR=$(echo "$BITBAKE_VARS" | grep ^STAGING_DIR_NATIVE \
  110. | cut -d '=' -f2 | cut -d '"' -f2)
  111. systemtap_target_arch "$TARGET_ARCH"
  112. if [ ! -d $TARGET_KERNEL_BUILDDIR ] ||
  113. [ ! -f $TARGET_KERNEL_BUILDDIR/vmlinux ]; then
  114. echo -e "\nError: No target kernel build found."
  115. echo -e "Did you forget to create a local build of your image?"
  116. setup_usage
  117. exit 1
  118. fi
  119. if [ ! -f $SYSTEMTAP_HOST_INSTALLDIR/usr/bin/stap ]; then
  120. echo -e "\nError: Native (host) systemtap not found."
  121. echo -e "Did you accidentally build a local non-sdk image? (or forget to"
  122. echo -e "add 'tools-profile' to EXTRA_IMAGE_FEATURES in your local.conf)?"
  123. echo -e "You can also: bitbake -c addto_recipe_sysroot systemtap-native"
  124. setup_usage
  125. exit 1
  126. fi
  127. target_user_hostname="$1"
  128. full_script_name="$2"
  129. script_name=$(basename "$2")
  130. script_base=${script_name%.*}
  131. shift 2
  132. ${SYSTEMTAP_HOST_INSTALLDIR}/usr/bin/stap \
  133. -a ${SYSTEMTAP_TARGET_ARCH} \
  134. -B CROSS_COMPILE="${STAGING_BINDIR_TOOLCHAIN}/${STAGING_BINDIR_TOOLPREFIX}" \
  135. -r ${TARGET_KERNEL_BUILDDIR} \
  136. -I ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/tapset \
  137. -R ${SYSTEMTAP_HOST_INSTALLDIR}/usr/share/systemtap/runtime \
  138. --remote=$target_user_hostname \
  139. -m $script_base \
  140. $full_script_name "$@"
  141. exit 0