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