Reviewers: Michael Starzinger,

Message:
Please take a look.


https://chromiumcodereview.appspot.com/10908122/diff/1/src/platform-linux.cc
File src/platform-linux.cc (left):

https://chromiumcodereview.appspot.com/10908122/diff/1/src/platform-linux.cc#oldcode515
src/platform-linux.cc:515: static const char kGCFakeMmap[] =
"/tmp/__v8_gc__";
There is not /tmp on Android.

Description:
Add support for running low level profiler on Android.

[email protected]


Please review this at https://chromiumcodereview.appspot.com/10908122/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/flag-definitions.h
  M src/platform-linux.cc
  M src/platform-openbsd.cc
  A tools/android-ll-prof.sh
  M tools/ll_prof.py


Index: src/flag-definitions.h
diff --git a/src/flag-definitions.h b/src/flag-definitions.h
index 9e54e46d89e7fed6cf38a86ae2848bb9f8e135ec..cb4dd5b662bd2da60705d0e41836b8c6e8d6604c 100644
--- a/src/flag-definitions.h
+++ b/src/flag-definitions.h
@@ -633,7 +633,8 @@ DEFINE_bool(sliding_state_window, false,
             "Update sliding state window counters.")
 DEFINE_string(logfile, "v8.log", "Specify the name of the log file.")
 DEFINE_bool(ll_prof, false, "Enable low-level linux profiler.")
-
+DEFINE_string(gc_fake_mmap, "/tmp/__v8_gc__",
+ "Specify the name of the file for fake gc mmap used in ll_prof")

 //
 // Disassembler only flags
Index: src/platform-linux.cc
diff --git a/src/platform-linux.cc b/src/platform-linux.cc
index d02244896bcf8930ecd895a92a7b2ab5a5365b32..606d10236eb5f6a498eda7034b609edd56974d7a 100644
--- a/src/platform-linux.cc
+++ b/src/platform-linux.cc
@@ -512,9 +512,6 @@ void OS::LogSharedLibraryAddresses() {
 }


-static const char kGCFakeMmap[] = "/tmp/__v8_gc__";
-
-
 void OS::SignalCodeMovingGC() {
   // Support for ll_prof.py.
   //
@@ -525,7 +522,7 @@ void OS::SignalCodeMovingGC() {
   // by the kernel and allows us to synchronize V8 code log and the
   // kernel log.
   int size = sysconf(_SC_PAGESIZE);
-  FILE* f = fopen(kGCFakeMmap, "w+");
+  FILE* f = fopen(FLAG_gc_fake_mmap, "w+");
   void* addr = mmap(OS::GetRandomMmapAddr(),
                     size,
                     PROT_READ | PROT_EXEC,
Index: src/platform-openbsd.cc
diff --git a/src/platform-openbsd.cc b/src/platform-openbsd.cc
index ba33a8444e23760a2b47585cb82e5c750074a8fd..408d4dc0f8487e08a8a4277ad8139f4910b6d4de 100644
--- a/src/platform-openbsd.cc
+++ b/src/platform-openbsd.cc
@@ -323,9 +323,6 @@ void OS::LogSharedLibraryAddresses() {
 }


-static const char kGCFakeMmap[] = "/tmp/__v8_gc__";
-
-
 void OS::SignalCodeMovingGC() {
   // Support for ll_prof.py.
   //
@@ -336,7 +333,7 @@ void OS::SignalCodeMovingGC() {
   // by the kernel and allows us to synchronize V8 code log and the
   // kernel log.
   int size = sysconf(_SC_PAGESIZE);
-  FILE* f = fopen(kGCFakeMmap, "w+");
+  FILE* f = fopen(FLAG_gc_fake_mmap, "w+");
   void* addr = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_PRIVATE,
                     fileno(f), 0);
   ASSERT(addr != MAP_FAILED);
Index: tools/android-ll-prof.sh
diff --git a/tools/android-ll-prof.sh b/tools/android-ll-prof.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1f0f02ddb7859da0dae74652cf95a3ea4d79d625
--- /dev/null
+++ b/tools/android-ll-prof.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+# Runs d8 with the given arguments on the device under 'perf' and
+# processes the profiler trace and v8 logs using ll_prof.py.
+#
+# Usage:
+# > ./tools/android-ll-prof.sh (debug|release) "args to d8" "args to ll_prof.py"
+#
+# The script assumes that the current directory is the v8 root directory.
+# It creates deploy directory ./deploy/data/local/tmp/v8, copies there the d8
+# binary either from out/android_arm.release or out/android_arm.debug, and
+# then sync the deploy directory with /data/local/tmp/v8 on the device.
+# You can put JS files in the deploy directory before running the script.
+# Note: $ANDROID_NDK_ROOT must be set.
+
+MODE=$1
+RUN_ARGS=$2
+LL_PROF_ARGS=$3
+
+BASE=`pwd`
+DEPLOY=$BASE/deploy
+
+set +e
+mkdir -p "$DEPLOY/data/local/tmp/v8"
+
+cp "$BASE/out/android_arm.$MODE/d8" "$DEPLOY/data/local/tmp/v8/d8"
+
+adb -p "$DEPLOY" sync data
+
+adb shell "cd /data/local/tmp/v8;\
+           perf record -R -e cycles -c 10000 -f -i \
+ ./d8 --ll_prof --gc-fake-mmap=/data/local/tmp/__v8_gc__ $RUN_ARGS"
+
+adb pull /data/local/tmp/v8/v8.log .
+adb pull /data/local/tmp/v8/v8.log.ll .
+adb pull /data/perf.data .
+
+ARCH=arm-linux-androideabi-4.4.3
+TOOLCHAIN=${ANDROID_NDK_ROOT}/toolchains/$ARCH/prebuilt/linux-x86/bin
+
+$BASE/tools/ll_prof.py --host-root="$BASE/deploy" \
+                       --gc-fake-mmap=/data/local/tmp/__v8_gc__ \
+ --objdump="$TOOLCHAIN/arm-linux-androideabi-objdump" \
+                       $LL_PROF_ARGS
Index: tools/ll_prof.py
diff --git a/tools/ll_prof.py b/tools/ll_prof.py
index 51ba672acaa6304b0e12d1fe21a0f90bc2ec87f4..3afe179d2f8adbc2935135c4efa9cb2f899c92a4 100755
--- a/tools/ll_prof.py
+++ b/tools/ll_prof.py
@@ -68,15 +68,9 @@ Examples:
 """


-# Must match kGcFakeMmap.
-V8_GC_FAKE_MMAP = "/tmp/__v8_gc__"
-
 JS_ORIGIN = "js"
 JS_SNAPSHOT_ORIGIN = "js-snapshot"

-OBJDUMP_BIN = disasm.OBJDUMP_BIN
-
-
 class Code(object):
   """Code object."""

@@ -639,7 +633,7 @@ class TraceReader(object):
     # Read null-terminated filename.
filename = self.trace[offset + self.header_size + ctypes.sizeof(mmap_info):
                           offset + header.size]
-    mmap_info.filename = filename[:filename.find(chr(0))]
+    mmap_info.filename = HOST_ROOT + filename[:filename.find(chr(0))]
     return mmap_info

   def ReadSample(self, header, offset):
@@ -858,6 +852,15 @@ if __name__ == "__main__":
                     default=False,
                     action="store_true",
                     help="no auxiliary messages [default: %default]")
+  parser.add_option("--gc-fake-mmap",
+                    default="/tmp/__v8_gc__",
+                    help="gc fake mmap file [default: %default]")
+  parser.add_option("--objdump",
+                    default="/usr/bin/objdump",
+                    help="objdump tool to use [default: %default]")
+  parser.add_option("--host-root",
+                    default="",
+                    help="Path to the host root [default: %default]")
   options, args = parser.parse_args()

   if not options.quiet:
@@ -869,6 +872,14 @@ if __name__ == "__main__":
       print "V8 log: %s, %s.ll (no snapshot)" % (options.log, options.log)
     print "Perf trace file: %s" % options.trace

+  V8_GC_FAKE_MMAP = options.gc_fake_mmap
+  HOST_ROOT = options.host_root
+  if os.path.exists(options.objdump):
+    disasm.OBJDUMP_BIN = options.objdump
+    OBJDUMP_BIN = options.objdump
+  else:
+ print "Cannot find %s, falling back to default objdump" % options.objdump
+
   # Stats.
   events = 0
   ticks = 0
@@ -905,7 +916,7 @@ if __name__ == "__main__":
     if header.type == PERF_RECORD_MMAP:
       start = time.time()
       mmap_info = trace_reader.ReadMmap(header, offset)
-      if mmap_info.filename == V8_GC_FAKE_MMAP:
+      if mmap_info.filename == HOST_ROOT + V8_GC_FAKE_MMAP:
         log_reader.ReadUpToGC()
       else:
         library_repo.Load(mmap_info, code_map, options)


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to