如何在android平台上的可执行文件中使用CallStack(在CallStack.tpp中)?
来自 我的最终目标是转储用户空间堆栈。 我尝试在android平台上构建一个cpp文件,如下所示,作为一个可执行文件。因此,通过调用tryToGetStack(),我可以在运行时获得可执行文件的调用堆栈如何在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();
#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种方式:
既然这是一个如此重要的问题,我的答案对我来说很有用。我的代码是在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