【问题标题】:How do I use ndk-stack using Android NDK r20?如何使用 Android NDK r20 使用 ndk-stack?
【发布时间】:2019-11-08 18:32:25
【问题描述】:

我正在尝试使用 ndk 提供的 ndk-stack 命令。

不幸的是,当我运行它时,脚本崩溃了。

我在windows上运行的命令是...

ndk-stack.cmd -sym build/intermediates/cmake/debug/obj/armeabi-v7a -dump stack.txt

stack.txt 文件包含来自 logcat 的墓碑。

我收到的错误是......

Traceback(最近一次调用最后一次):文件 "C:\Android\android-ndk-r20\prebuilt\windows-x86_64\bin\ndk-stack.py", 第 134 行,在 main() 文件 "C:\Android\android-ndk-r20\prebuilt\windows-x86_64\bin\ndk-stack.py", 第 83 行,主要 proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 文件 "C:\Android\android-ndk-r20\prebuilt\windows-x86_64\lib\python2.7/subprocess.py", 第 711 行,在 init 中 errread, errwrite) 文件 "C:\Android\android-ndk-r20\prebuilt\windows-x86_64\lib\python2.7/subprocess.py", 第 948 行,在 _execute_child 中 startupinfo) WindowsError: [错误 2] 系统找不到指定的文件 [Finished in 0.1s]

【问题讨论】:

    标签: android python c++ android-ndk android-sdk-2.3


    【解决方案1】:

    cferris 前几天修复了这个问题:https://android-review.googlesource.com/c/platform/ndk/+/977970

    这是您需要在本地应用的补丁(或等待 NDK r21):

    diff --git a/ndk-stack.py b/ndk-stack.py
    index 93aa0297..f1bb4cd6 100755
    --- a/ndk-stack.py
    +++ b/ndk-stack.py
    @@ -32,6 +32,10 @@ def find_llvm_symbolizer():
    
         Returns: An absolute path to llvm-symbolizer(1)."""
    
    +    llvm_symbolizer = 'llvm-symbolizer'
    +    if os.name == 'nt':
    +        # Windows has to include the exe or it won't be found.
    +        llvm_symbolizer += '.exe'
         # ndk-stack is installed to $NDK/prebuilt/<platform>/bin, so from
         # `~/Downloads/android-ndk-r18/prebuilt/linux-x86_64/bin/ndk-stack`...
         # ...get `/usr/enh/Downloads/android-ndk-r18/`:
    @@ -42,14 +46,14 @@ def find_llvm_symbolizer():
         # And from there construct the llvm-symbolizer path.
         llvm_bin = os.path.join(ndk_root, 'toolchains', 'llvm', 'prebuilt', arch,
                                 'bin')
    -    path = os.path.join(llvm_bin, 'llvm-symbolizer')
    +    path = os.path.join(llvm_bin, llvm_symbolizer)
         if os.path.exists(path):
             return path
    
         # Okay, maybe we're a standalone toolchain? (https://github.com/android-ndk
    /ndk/issues/931)
         # In that case, llvm-symbolizer and ndk-stack are conveniently in
         # the same directory...
    -    return os.path.abspath(os.path.join(ndk_bin, 'llvm-symbolizer'))
    +    return os.path.abspath(os.path.join(ndk_bin, llvm_symbolizer))
    
    
     def main():
    
    

    基本上“您需要将 .exe 添加到提到 llvm-symbolizer 的两个地方”。 (我引入这个错误是因为我认为你不需要明确地说“blah.exe”。)

    【讨论】:

    • 那行得通。但是现在它只提供一个堆栈帧深度的结果,而墓碑列出了许多堆栈帧。我想这是一个单独的问题,超出了这个特定问题的范围。
    • 我无法在 Windows 上使用该补丁(它在第 6 行显示错误:损坏的补丁),但手动应用更改确实有帮助。
    • 抱歉拖了这么久,NDK r21 beta 1 现已推出,顺便说一句:github.com/android/ndk/wiki
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2013-10-15
    • 2018-01-08
    相关资源
    最近更新 更多