When a bit of native Android code crashes, the system generates a dump of the stack and registers at the crash point. Provided I have a copy of the crashed library with debug symbols in it (i. e. unstripped), can I retrieve the names/values of local variables of the crashed function and the functions up the call stack?
The values are all there in the stack. The description of the stack structure has to be somewhere in the debug info, or how would the debugger decypher them at run time.
If I correctly understood your question then you can do this. I have a note that I wrote for me, here I just put the content of it without modifications.
For instance, imagine that you have the following error in your logcat:
I/DEBUG ( 72): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 72): Build fingerprint: 'generic/full_crespo/crespo:2.3.4/GRJ22/eng.yury.20120906.111243:eng/test-keys'
I/DEBUG ( 72): pid: 694, tid: 694 >>> app_process <<<
I/DEBUG ( 72): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
I/DEBUG ( 72): r0 fffffe74 r1 deadd00d r2 00000026 r3 00000000
I/DEBUG ( 72): r4 acaab808 r5 aca91541 r6 00000000 r7 4214f8b8
I/DEBUG ( 72): r8 400290c8 r9 0000ce78 10 4214f8a0 fp 41908f70
I/DEBUG ( 72): ip acaab914 sp beac9b50 lr afd191d9 pc aca48b88 cpsr 20000030
I/DEBUG ( 72): d0 74726f6261204d69 d1 7461736e552f676e
I/DEBUG ( 72): d2 694c646569667367 d3 3b726f7272456b0a
I/DEBUG ( 72): d4 42151f7c42151f48 d5 421531b042151fb0
I/DEBUG ( 72): d6 42153218421531e4 d7 421532804215324c
I/DEBUG ( 72): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 72): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 72): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 72): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 72): d16 42194090000003e8 d17 0000000000000000
I/DEBUG ( 72): d18 0000000000000000 d19 0000000000000000
I/DEBUG ( 72): d20 0000000000000000 d21 0000000000000000
I/DEBUG ( 72): d22 0000000000000000 d23 0000000000000000
I/DEBUG ( 72): d24 0000000000000000 d25 0000000000000000
I/DEBUG ( 72): d26 0000000000000000 d27 0000000000000000
I/DEBUG ( 72): d28 0000000000000000 d29 0000000000000000
I/DEBUG ( 72): d30 0000000000000000 d31 0000000000000000
I/DEBUG ( 72): scr 60000000
I/DEBUG ( 72):
I/DEBUG ( 72): #00 pc 00048b88 /system/lib/libdvm.so
I/DEBUG ( 72): #01 pc 000482b6 /system/lib/libdvm.so
I/DEBUG ( 72): #02 pc 00051886 /system/lib/libdvm.so
I/DEBUG ( 72): #03 pc 00019510 /system/lib/libdvm.so
I/DEBUG ( 72): #04 pc 0001e838 /system/lib/libdvm.so
I/DEBUG ( 72): #05 pc 0001d714 /system/lib/libdvm.so
I/DEBUG ( 72): #06 pc 0006297c /system/lib/libdvm.so
I/DEBUG ( 72): #07 pc 0006a85a /system/lib/libdvm.so
I/DEBUG ( 72): #08 pc 00019510 /system/lib/libdvm.so
I/DEBUG ( 72): #09 pc 0001e838 /system/lib/libdvm.so
I/DEBUG ( 72): #10 pc 0001d714 /system/lib/libdvm.so
I/DEBUG ( 72): #11 pc 00062714 /system/lib/libdvm.so
I/DEBUG ( 72): #12 pc 00062a04 /system/lib/libdvm.so
I/DEBUG ( 72): #13 pc 0006e13e /system/lib/libdvm.so
I/DEBUG ( 72): #14 pc 0006f3da /system/lib/libdvm.so
I/DEBUG ( 72): #15 pc 00017d7c /system/lib/libdvm.so
I/DEBUG ( 72): #16 pc 0001e838 /system/lib/libdvm.so
I/DEBUG ( 72): #17 pc 0001d714 /system/lib/libdvm.so
I/DEBUG ( 72): #18 pc 00062714 /system/lib/libdvm.so
I/DEBUG ( 72): #19 pc 00062a04 /system/lib/libdvm.so
I/DEBUG ( 72): #20 pc 0006e566 /system/lib/libdvm.so
I/DEBUG ( 72): #21 pc 000561ec /system/lib/libdvm.so
I/DEBUG ( 72): #22 pc 0004a564 /system/lib/libdvm.so
I/DEBUG ( 72): #23 pc 0004c5fa /system/lib/libdvm.so
I/DEBUG ( 72): #24 pc 00032f98 /system/lib/libandroid_runtime.so
I/DEBUG ( 72): #25 pc 000333d4 /system/lib/libandroid_runtime.so
I/DEBUG ( 72): #26 pc 0003358c /system/lib/libandroid_runtime.so
I/DEBUG ( 72): #27 pc 00008ce8 /system/bin/app_process
I/DEBUG ( 72): #28 pc 00014b52 /system/lib/libc.so
I/DEBUG ( 72):
I/DEBUG ( 72): code around pc:
I/DEBUG ( 72): aca48b68 447a4479 f7c94c0b 2000ee20 ef18f7c9
I/DEBUG ( 72): aca48b78 447c4809 6bdb5823 4798b103 22264902
I/DEBUG ( 72): aca48b88 f7c9700a bf00ef80 deadd00d 00045bc7
I/DEBUG ( 72): aca48b98 00047785 00062c8a fffffe74 4b09b40e
I/DEBUG ( 72): aca48ba8 4c09b517 aa05447b f852591b 6b5b1b04
I/DEBUG ( 72):
I/DEBUG ( 72): code around lr:
I/DEBUG ( 72): afd191b8 4a0e4b0d e92d447b 589c41f0 26004680
I/DEBUG ( 72): afd191c8 686768a5 f9b5e006 b113300c 47c04628
I/DEBUG ( 72): afd191d8 35544306 37fff117 6824d5f5 d1ef2c00
I/DEBUG ( 72): afd191e8 e8bd4630 bf0081f0 00028344 ffffff88
I/DEBUG ( 72): afd191f8 b086b570 f602fb01 9004460c a804a901
I/DEBUG ( 72):
I/DEBUG ( 72): stack:
I/DEBUG ( 72): beac9b10 aca13280 /system/lib/libdvm.so
I/DEBUG ( 72): beac9b14 aca14970 /system/lib/libdvm.so
I/DEBUG ( 72): beac9b18 00000000
I/DEBUG ( 72): beac9b1c beac9b68
I/DEBUG ( 72): beac9b20 afd4270c
I/DEBUG ( 72): beac9b24 afd426b8
I/DEBUG ( 72): beac9b28 00000000
I/DEBUG ( 72): beac9b2c afd191d9 /system/lib/libc.so
I/DEBUG ( 72): beac9b30 00062c8a
I/DEBUG ( 72): beac9b34 aca91541 /system/lib/libdvm.so
I/DEBUG ( 72): beac9b38 00000000
I/DEBUG ( 72): beac9b3c 4214f8b8
I/DEBUG ( 72): beac9b40 400290c8
I/DEBUG ( 72): beac9b44 afd182d1 /system/lib/libc.so
I/DEBUG ( 72): beac9b48 df002777
I/DEBUG ( 72): beac9b4c e3a070ad
I/DEBUG ( 72): #00 beac9b50 4324ad8f
I/DEBUG ( 72): beac9b54 aca482bb /system/lib/libdvm.so
I/DEBUG ( 72): #01 beac9b58 4324ad8f
I/DEBUG ( 72): beac9b5c 4324ad8f
I/DEBUG ( 72): beac9b60 4219429c
I/DEBUG ( 72): beac9b64 00000000
I/DEBUG ( 72): beac9b68 00011f28
I/DEBUG ( 72): beac9b6c aca5188b /system/lib/libdvm.so
You can use a special utility called stack (I do not remember where I downloaded it). So here is the content of this utility):
#!/usr/bin/python2.4 -E
import getopt
import os
import re
import string
import sys
import getpass
import urllib
import subprocess
def PrintUsage():
print
print " usage: " + sys.argv[0] + " [options] [FILE]"
print
print " --symbols-dir=path"
print " the path to a symbols dir, such as =/tmp/out/target/product/dream/symbols"
print
print " --symbols-zip=path"
print " the path to a symbols zip file, such as =dream-symbols-12345.zip"
print
print " --auto"
print " attempt to:"
print " 1) automatically find the build number in the crash"
print " 2) if it's an official build, download the symbols "
print " from the build server, and use them"
print
print " FILE should contain a stack trace in it somewhere"
print " the tool will find that and re-print it with"
print " source files and line numbers. If you don't"
print " pass FILE, or if file is -, it reads from"
print " stdin."
print
sys.exit(1)
def FindSymbolsDir():
cmd = "CALLED_FROM_SETUP=true make -f build/core/envsetup.mk " \
+ "dumpvar-abs-TARGET_OUT_UNSTRIPPED"
stream = os.popen(cmd)
str = stream.read()
stream.close()
return str.strip()
# returns a list containing the function name and the file/lineno
def CallAddr2Line(lib, addr):
uname = os.uname()[0]
if uname == "Darwin":
proc = os.uname()[-1]
if proc == "i386":
uname = "darwin-x86"
else:
uname = "darwin-ppc"
if lib != "":
#cmd = "./prebuilt/" + uname + "/toolchain-eabi-4.2.1/bin/arm-eabi-addr2line" \
cmd = "arm-eabi-addr2line" \
+ " -f -e " + SYMBOLS_DIR + lib \
+ " 0x" + addr
stream = os.popen(cmd)
lines = stream.readlines()
list = map(string.strip, lines)
else:
list = []
if list != []:
# Name like "move_forward_type<JavaVMOption>" causes troubles
mangled_name = re.sub('<', '\<', list[0]);
mangled_name = re.sub('>', '\>', mangled_name);
#cmd = "./prebuilt/" + uname + "/toolchain-eabi-4.2.1/bin/arm-eabi-c++filt "\
cmd = "arm-eabi-c++filt "\
+ mangled_name
stream = os.popen(cmd)
list[0] = stream.readline()
stream.close()
list = map(string.strip, list)
else:
list = [ "(unknown)", "(unknown)" ]
return list
class SSOCookie(object):
"""
creates a cookie file so we can download files from the build server
"""
def __init__(self, cookiename=".sso.cookie", keep=False):
self.sso_server = "login.corp.google.com"
self.name = cookiename
self.keeper = keep
self.tmp_opts = ".curl.options"
if not os.path.exists(self.name):
user = os.environ['USER']
print "\n%s, to access the symbols, please enter your LDAP " % user,
password = getpass.getpass()
params = urllib.urlencode({"u": user, "pw": password})
fd = os.open(self.tmp_opts, os.O_RDWR | os.O_CREAT, 0600)
os.write(fd, '-b "%s"\n' % self.name)
os.write(fd, '-c "%s"\n' % self.name)
os.write(fd, '-s"\n-L\n-d "%s"\n' % params)
os.write(fd, 'url = "https://%s/login?ssoformat=CORP_SSO"\n' %
self.sso_server)
# login to SSO
response = os.popen("/usr/bin/curl -K %s" % self.tmp_opts)
response.close()
if os.path.exists(self.tmp_opts):
os.remove(self.tmp_opts)
if os.path.exists(self.name):
os.chmod(self.name, 0600)
else:
print "Could not log in to SSO"
sys.exit(1)
def __del__(self):
"""clean up"""
if not self.keeper:
os.remove(self.name)
class NoBuildIDException(Exception):
pass
def FindBuildFingerprint(lines):
"""
Searches the given file (array of lines) for the build fingerprint information
"""
fingerprint_regex = re.compile("^.*Build fingerprint:\s'(?P<fingerprint>.*)'")
for line in lines:
fingerprint_search = fingerprint_regex.match(line.strip())
if fingerprint_search:
return fingerprint_search.group('fingerprint')
return None # didn't find the fingerprint string, so return none
class SymbolDownloadException(Exception):
pass
DEFAULT_SYMROOT = "/tmp/symbols"
def DownloadSymbols(fingerprint, cookie):
"""
Attempts to download the symbols from the build server, extracts them,
and returns the path. Takes the fingerprint from the pasted stack trace
and the SSOCookie
"""
if fingerprint is None:
return (None, None)
symdir = "%s/%s" % (DEFAULT_SYMROOT, hash(fingerprint))
if not os.path.exists(symdir):
os.makedirs(symdir)
# build server figures out the branch based on the CL
params = {
'op': "GET-SYMBOLS-LINK",
'fingerprint': fingerprint,
}
url = urllib.urlopen("http://android-build/buildbot-update?",
urllib.urlencode(params)).readlines()[0]
if url == "":
raise SymbolDownloadException, "Build server down? Failed to find syms..."
regex_str = (r'(?P<baseURL>http\:\/\/android-build\/builds\/.*\/[0-9]+' +
r'\/)(?P<img>.*)')
url_regex = re.compile(regex_str)
url_match = url_regex.match(url)
if url_match is None:
raise SymbolDownloadException, "Unexpected results from build server URL..."
baseURL = url_match.group('baseURL')
img = url_match.group('img')
symbolfile = img.replace("-img-", "-symbols-")
symurl = baseURL + symbolfile
localsyms = symdir + symbolfile
if not os.path.exists(localsyms):
print "downloading %s ..." % symurl
curlcmd = ("""/usr/bin/curl -b %s -sL -w %%{http_code} -o %s %s""" %
(cookie.name, localsyms, symurl))
(fi,fo,fe) = os.popen3(curlcmd)
fi.close()
code = fo.read()
err = fe.read()
if err != "":
raise SymbolDownloadException, "stderr from curl download: %s" % err
if code != "200":
raise SymbolDownloadException, "Faied to download %s" % symurl
else:
print "using existing cache for symbols"
print "extracting %s..." % symbolfile
saveddir = os.getcwd()
os.chdir(symdir)
unzipcode = subprocess.call(["unzip", "-qq", "-o", localsyms])
if unzipcode > 0:
raise SymbolDownloadException, ("failed to extract symbol files (%s)."
% localsyms)
os.chdir(saveddir)
return (symdir, "%s/out/target/product/dream/symbols" % symdir)
def UnzipSymbols(symbolfile):
"""Unzips a file to DEFAULT_SYMROOT and returns the unzipped location.
Args:
symbolfile: The .zip file to unzip
Returns:
A tuple containing (the directory into which the zip file was unzipped,
the path to the "symbols" directory in the unzipped file). To clean
up, the caller can delete the first element of the tuple.
Raises:
SymbolDownloadException: When the unzip fails.
"""
symdir = "%s/%s" % (DEFAULT_SYMROOT, hash(symbolfile))
if not os.path.exists(symdir):
os.makedirs(symdir)
print "extracting %s..." % symbolfile
saveddir = os.getcwd()
os.chdir(symdir)
unzipcode = subprocess.call(["unzip", "-qq", "-o", symbolfile])
if unzipcode > 0:
raise SymbolDownloadException, ("failed to extract symbol files (%s)."
% symbolfile)
os.chdir(saveddir)
return (symdir, "%s/out/target/product/dream/symbols" % symdir)
def PrintTraceLines(traceLines):
maxlen = max(map(lambda tl: len(tl[1]), traceLines))
print
print "Stack Trace:"
print " ADDR " + "FUNCTION".ljust(maxlen) + " FILE:LINE"
for tl in traceLines:
print " " + tl[0] + " " + tl[1].ljust(maxlen) + " " + tl[2]
return
def PrintValueLines(valueLines):
print
print "Stack Data:"
print " ADDR VALUE " + "FILE:LINE/FUNCTION"
for vl in valueLines:
print " " + vl[1] + " " + vl[2] + " " + vl[4]
if vl[4] != "":
print " " + vl[3]
return
def ConvertTrace(lines):
PROCESS_INFO_LINE = re.compile("(pid: [0-9]+, tid: [0-9]+.*)")
SIGNAL_LINE = re.compile("(signal [0-9]+ \(.*\).*)")
REGISTER_LINE = re.compile("(([ ]*[0-9a-z]{2} [0-9a-f]{8}){4})")
TRACE_LINE = re.compile("(.*)\#([0-9]+) (..) ([0-9a-f]{3})([0-9a-f]{5}) ([^\r\n \t]*)")
VALUE_LINE = re.compile("(.*)([0-9a-f]{2})([0-9a-f]{6}) ([0-9a-f]{3})([0-9a-f]{5}) ([^\r\n \t]*)")
THREAD_LINE = re.compile("(.*)(\-\-\- ){15}\-\-\-")
traceLines = []
valueLines = []
for line in lines:
header = PROCESS_INFO_LINE.search(line)
if header:
print header.group(1)
continue
header = SIGNAL_LINE.search(line)
if header:
print header.group(1)
continue
header = REGISTER_LINE.search(line)
if header:
print header.group(1)
continue
if TRACE_LINE.match(line):
match = TRACE_LINE.match(line)
groups = match.groups()
if groups[5] == "<unknown>" or groups[5] == "[heap]" or groups[5] == "[stack]":
traceLines.append((groups[3]+groups[4], groups[5], groups[5]))
else:
info = CallAddr2Line(groups[5], groups[4])
traceLines.append((groups[3]+groups[4], info[0], info[1]))
if VALUE_LINE.match(line):
match = VALUE_LINE.match(line)
groups = match.groups()
if groups[5] == "<unknown>" or groups[5] == "[heap]" or groups[5] == "[stack]" or groups[5] == "":
valueLines.append((groups[0], groups[1]+groups[2], groups[3]+groups[4], groups[5], ""))
else:
info = CallAddr2Line(groups[5], groups[4])
valueLines.append((groups[0], groups[1]+groups[2], groups[3]+groups[4], info[0], info[1]))
header = THREAD_LINE.search(line)
if header:
if len(traceLines) > 0:
PrintTraceLines(traceLines)
if len(valueLines) > 0:
PrintValueLines(valueLines)
traceLines = []
valueLines = []
print
print "-----------------------------------------------------\n"
if len(traceLines) > 0:
PrintTraceLines(traceLines)
if len(valueLines) > 0:
PrintValueLines(valueLines)
SYMBOLS_DIR = FindSymbolsDir()
if __name__ == '__main__':
try:
options, arguments = getopt.getopt(sys.argv[1:], "",
["auto", "symbols-dir=", "symbols-zip=", "help"])
except getopt.GetoptError, error:
PrintUsage()
AUTO = False
zipArg = None
for option, value in options:
if option == "--help":
PrintUsage()
elif option == "--symbols-dir":
SYMBOLS_DIR = value
elif option == "--symbols-zip":
zipArg = value
elif option == "--auto":
AUTO = True
if len(arguments) > 1:
PrintUsage()
if AUTO:
cookie = SSOCookie(".symbols.cookie")
if len(arguments) == 0 or arguments[0] == "-":
print "Reading native crash info from stdin"
f = sys.stdin
else:
print "Searching for native crashes in %s" % arguments[0]
f = open(arguments[0], "r")
lines = f.readlines()
rootdir = None
if AUTO:
fingerprint = FindBuildFingerprint(lines)
print "fingerprint:", fingerprint
rootdir, SYMBOLS_DIR = DownloadSymbols(fingerprint, cookie)
elif zipArg is not None:
rootdir, SYMBOLS_DIR = UnzipSymbols(zipArg)
print "Reading symbols from", SYMBOLS_DIR
lines = ConvertTrace(lines)
if rootdir is not None:
# be a good citizen and clean up...os.rmdir and os.removedirs() don't work
cmd = "rm -rf \"%s\"" % rootdir
print "\ncleaning up (%s)" % cmd
os.system(cmd)
# vi: ts=2 sw=2
You can use the utility in the following way:
python stack.py [options] [FILE]
Options:
--symbols-dir=path
the path to a symbols dir, such as
=/tmp/out/target/product/dream/symbols
--symbols-zip=path
the path to a symbols zip file, such as
=dream-symbols-12345.zip"
--auto
attempt to:
1) automatically find the build number in the crash
2) if it's an official build, download the symbols from the build server, and use them
FILE
should contain a stack trace in it somewhere the tool will find that and re-print it with source files and line numbers. If you don't pass FILE, or if file is -, it reads from stdin.
Example:
python stack.py --symbols-dir=/home/yury/PROJECTS/MOSES/source_code/MOSES/out/target/product/crespo/symbols error.txt
After that you'll see the following output:
yury@yury-laptop:~/PROJECTS/MOSES/source_code/MOSES$ python stack.py --symbols-dir=/home/yury/PROJECTS/MOSES/source_code/MOSES/out/target/product/crespo/symbols error.txt
build/core/envsetup.mk:11: /version_defaults.mk: No such file or directory
build/core/envsetup.mk:41: /product_config.mk: No such file or directory
make: *** No rule to make target `/product_config.mk'. Stop.
Searching for native crashes in error.txt
Reading symbols from /home/yury/PROJECTS/MOSES/source_code/MOSES/out/target/product/crespo/symbols
pid: 694, tid: 694 >>> app_process <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
r0 fffffe74 r1 deadd00d r2 00000026 r3 00000000
r4 acaab808 r5 aca91541 r6 00000000 r7 4214f8b8
r8 400290c8 r9 0000ce78 10 4214f8a0 fp 41908f70
ip acaab914 sp beac9b50 lr afd191d9 pc aca48b88
Stack Trace:
ADDR FUNCTION FILE:LINE
00048b88 dvmAbort /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Init.c:1738
000482b6 dvmThrowChainedException /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Exception.c:230
00051886 dvmThrowException /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Exception.h:35
00019510 dalvik_mterp /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:13163
0001e838 dvmMterpStd /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/Mterp.c:105
0001d714 dvmInterpret /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Interp.c:1369
0006297c dvmInvokeMethod /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Stack.c:1000
0006a85a Dalvik_java_lang_reflect_Method_invokeNative /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/native/java_lang_reflect_Method.c:101
00019510 dalvik_mterp /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:13163
0001e838 dvmMterpStd /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/Mterp.c:105
0001d714 dvmInterpret /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Interp.c:1369
00062714 dvmCallMethodV /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Stack.c:623
00062a04 dvmCallMethod /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Stack.c:461
0006e13e dvmInitClass /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/oo/Class.c:4480
0006f3da dvmResolveStaticField /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/oo/Resolve.c:493
00017d7c cmp_long_taint_prop /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:10110
0001e838 dvmMterpStd /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/Mterp.c:105
0001d714 dvmInterpret /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Interp.c:1369
00062714 dvmCallMethodV /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Stack.c:623
00062a04 dvmCallMethod /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/interp/Stack.c:461
0006e566 dvmGetSystemClassLoader /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/oo/Class.c:4665
000561ec dvmPrepMainThread /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Thread.c:878
0004a564 dvmStartup /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Init.c:1301
0004c5fa JNI_CreateJavaVM /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Jni.c:4503
00032f98 android::AndroidRuntime::startVm(_JavaVM**, _JNIEnv**) /home/yury/PROJECTS/MOSES/source_code/MOSES/frameworks/base/core/jni/AndroidRuntime.cpp:866
000333d4 android::AndroidRuntime::start(char const*, bool) /home/yury/PROJECTS/MOSES/source_code/MOSES/frameworks/base/core/jni/AndroidRuntime.cpp:919
0003358c android::AndroidRuntime::start() /home/yury/PROJECTS/MOSES/source_code/MOSES/frameworks/base/core/jni/AndroidRuntime.cpp:996
00008ce8 main /home/yury/PROJECTS/MOSES/source_code/MOSES/frameworks/base/cmds/app_process/app_main.cpp:171
00014b52 __libc_init /home/yury/PROJECTS/MOSES/source_code/MOSES/bionic/libc/bionic/libc_init_dynamic.c:114
Stack Data:
ADDR VALUE FILE:LINE/FUNCTION
beac9b10 aca13280 /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:451
dvmAsmInstructionStart
beac9b14 aca14970 /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/mterp/out/InterpAsm-armv7-a-neon.S:2994
dalvik_inst
beac9b18 00000000
beac9b1c beac9b68
beac9b20 afd4270c
beac9b24 afd426b8
beac9b28 00000000
beac9b2c afd191d9 /home/yury/PROJECTS/MOSES/source_code/MOSES/bionic/libc/stdio/fwalk.c:50
_fwalk
beac9b30 00062c8a
beac9b34 aca91541 ??:0
??
beac9b38 00000000
beac9b3c 4214f8b8
beac9b40 400290c8
beac9b44 afd182d1 /home/yury/PROJECTS/MOSES/source_code/MOSES/bionic/libc/stdio/fflush.c:44
fflush
beac9b48 df002777
beac9b4c e3a070ad
beac9b50 4324ad8f
beac9b54 aca482bb /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Exception.c:234
dvmThrowChainedException
beac9b58 4324ad8f
beac9b5c 4324ad8f
beac9b60 4219429c
beac9b64 00000000
beac9b68 00011f28
beac9b6c aca5188b /home/yury/PROJECTS/MOSES/source_code/MOSES/dalvik/vm/Native.c:128
dvmResolveNativeMethod