如何在android平台上的可执行文件中使用CallStack(在CallStack.tpp中)?

如何在android平台上的可执行文件中使用CallStack(在CallStack.tpp中)?,android,linux,build,stack-trace,callstack,Android,Linux,Build,Stack Trace,Callstack,来自 我的最终目标是转储用户空间堆栈。 我尝试在android平台上构建一个cpp文件,如下所示,作为一个可执行文件。因此,通过调用tryToGetStack(),我可以在运行时获得可执行文件的调用堆栈 #include <utils/CallStack.h> namespace android { extern "C" void tryToGetStack() { CallStack stack; stack.update();

来自

我的最终目标是转储用户空间堆栈。

我尝试在android平台上构建一个cpp文件,如下所示,作为一个可执行文件。因此,通过调用tryToGetStack(),我可以在运行时获得可执行文件的调用堆栈

#include <utils/CallStack.h>
namespace android
{
    extern "C" void tryToGetStack()
    {
        CallStack stack;
        stack.update();
        stack.dump("");
    }
}
#包括
名称空间android
{
外部“C”void tryToGetStack()
{
调用堆栈;
stack.update();
堆栈转储(“”);
}
}
并将lib设置添加到Android.mak,因为CallStack.tpp位于libutils中

本地共享库+=libutils

但我总是收到错误的信息:

错误:未定义对“android::CallStack::CallStack()”的引用

错误:未定义对“android::CallStack::update(int,int)”的引用

似乎可执行文件在链接时解析符号,而不是在运行时加载.so文件? 我是否遗漏了一些东西,或者Android构建系统中存在一些限制

我知道这是一个简单的问题,但我真的需要帮助

更新1

我尝试将代码添加到另一个可执行文件中。结果是一样的。。。有人知道android构建系统的规则吗

更新2

在我的控制台中有一些关键词“target StaticExecutable:…”
,我想这就是答案


我的最终目标是转储用户空间堆栈

在谷歌搜索了这么多来自互联网的信息后,我发现有4种方式:

  • ptrace

    使用ptrace确实很难,我们需要在使用ptrace连接之前停止线程

  • \u unwind\u backtrace:CallStack使用的方式(CallStack.cpp中的CallStack类)

    例如:

    这是一个缺点:如果将其用作线程处理信号,它将转储信号堆栈而不是转储线程堆栈

    同样的问题:

  • 回溯

    GNU扩展函数,不能在Android使用的仿生libc中实现

    参考:

    参考:

  • 转储用户空间线程堆栈的修补程序

    但只能在X86体系结构中实现。。。奥兹

    我试着把它移植到android上,不,它只显示堆栈的第一帧,因为arm不使用帧指针

  • 所以。。。答案是2

    但是,我想知道是否有人能解决这个问题:

    更新:

    如果您可以使用交叉编译器来使用glic来编译代码,也许您可以使用3。回溯!

    更新2 好文章


    既然这是一个如此重要的问题,我的答案对我来说很有用。我的代码是在C中,所以它必须调用一个可以访问Android的C++函数:CallStack。 stackdump.cpp:

    #include < utils/CallStack.h >
    extern "C" void dumpCallStack( char *label)
    {
       android::CallStack cs;
       cs.update();
       cs.dump(label);
    }
    

    我曾经有过同样的问题。而且很难解释

    语法当然是正确和合理的

    我试过很多方法,但都不管用

    最后,我得到一个想法,lib引用“LOCAL_SHARED_LIBRARIES+=libutils”应该放在生成动态库的makefile中,而不是放在生成静态库的makefile中。这是最后的原因

    参考:
    我也收到了这个错误,但我添加了:

    LOCAL_STATIC_LIBRARIES += libutils 
    
    在三个目标的
    vm/Android.m
    中的
    LOCAL\u模块:=xxx
    行之前添加

    LOCAL_SHARED_LIBRARIES += libcorkscrew
    
    vm/Android.mk

    libdex/Android.mk
    ,对于
    dexlist/Android.mk
    dextump/Android.mk


    完成所有这些之后,它对我很有用。

    仅供参考,android-p上的
    libutilscallstack
    中现在似乎提供了CallStack。
    LOCAL_SHARED_LIBRARIES += libcorkscrew