Extracting variables from crash dump

2019-04-13 12:18发布

问题:

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.

回答1:

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