2012-11-02 56 views
2

当一些原生Android代码崩溃时,系统会生成堆栈转储并在崩溃点注册。假设我有一个带有调试符号的崩溃库的副本(即未被解压),我可以检索崩溃函数的本地变量的名称/值和调用堆栈的函数吗?从崩溃转储中提取变量

这些值都在堆栈中。堆栈结构的描述必须位于调试信息的某个位置,或者调试器在运行时如何解密它们。

回答

3

如果我正确理解你的问题,那么你可以做到这一点。我有一个笔记,我写给我,这里我只是把它的内容没有修改。

例如,假设您在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 

您可以使用一个特殊的工具,叫做堆栈(我不记得在那里我下载)。因此,这里是该实用程序的内容):

#!/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 

您可以使用该工具以下列方式:

python stack.py [options] [FILE] 

选项:

  • --symbols-dir=path的路径,一个符号目录,如 =/tmp/out/target/product/dream/symbols
  • --symbols-zip=path指向符号zip文件的路径,如 = dream-symbols-12345.zip”
  • --auto尝试:

    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

    应当在其中包含一个堆栈跟踪某处的工具,就会发现,并重新打印它源文件和行号。如果您不通过FILE,或者文件是 - ,它会从stdin读取。

例子:

python stack.py --symbols-dir=/home/yury/PROJECTS/MOSES/source_code/MOSES/out/target/product/crespo/symbols error.txt 

后,你会看到下面的输出:

[email protected]:~/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 
+0

- 尼斯找到。但是,这不是我所追求的。使用'addr2line'将* call * stack翻译成函数名是非常简单的。我将堆栈*帧*内容翻译为变量之后。 –

+0

但下面有一个“堆栈数据”部分,您可以在其中找到变量的地址及其值。我没有看到变量的名称,但可能无法得到。或者,也许我不明白什么? – Yury

+0

这些名字是可能的 - gdb在调试时没有问题。我也想。 –