https://stackoverflow.com/a/11467040/1442443的一个问题
我的最后一个目标是转储用户空间堆栈.
我试着在安卓平台上构建一个可执行的cpp文件,如下所示。因此,通过调用tryToGetStack(),我可以在运行时获得可执行文件的调用堆栈。
#include <utils/CallStack.h>
namespace android
{
extern "C" void tryToGetStack()
{
CallStack stack;
stack.update();
stack.dump("");
}
}并将lib设置添加到Android.mak,因为CallStack.tpp在libutils中。
LOCAL_SHARED_LIBRARIES += libutils
但我总是收到错误的信息:
错误:对'android::CallStack::CallStack()‘的未定义引用 错误:对'android::CallStack::update(int,int)‘的未定义引用 ..。
似乎可执行文件在链接时解析符号,而不是在运行时加载.so文件?我是遗漏了什么,还是Android构建系统有一些限制?
我知道这是个简单的问题,但我真的需要帮助.
update1
我尝试将代码添加到另一个可执行文件中。结果是一样的。有人知道android构建系统的规则吗?
update2
在我的控制台中有一些关键词“target StaticExecutable:.”,我认为这是答案。
executable
发布于 2012-07-18 09:30:02
我的最后一个目标是转储用户空间堆栈。
在谷歌搜索了这么多来自互联网的信息之后,我发现有四种方式:
所以..。2是答案。
但是,我想知道是否有人能解决这个问题:Backtrace on SIGSEGV
更新:
如果你可以使用交叉编译器来编译你的代码,也许你可以使用3.Backtrace!http://communities.mentor.com/community/cs/archives/arm-gnu/msg02514.html。
update2一篇好文章
http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html
发布于 2014-02-28 09:32:52
我也有过同样的问题。而且很难解释。
语法当然是正确和合理的!
我试过很多方法,但都没有用。
最后,我有一个想法,即库引用"LOCAL_SHARED_LIBRARIES += libutils“应该放在生成动态库的makefile中,而不是放在生成静态库的makefile中。这是最后的原因。
参考资料:http://yongbingchen.github.io/blog/2013/05/09/dump-stack-in-android-native-c-code/
发布于 2017-07-30 15:55:19
我也收到了这个错误,但是我补充说:
LOCAL_STATIC_LIBRARIES += libutils 三个目标的LOCAL_MODULE := xxx前行在vm/Android.m中添加
LOCAL_SHARED_LIBRARIES += libcorkscrew在vm/Android.mk中
和libdex/Android.mk,dexlist/Android.mk,dexdump/Android.mk也是一样
这些都做完了,对我来说很管用。
https://stackoverflow.com/questions/11470190
复制相似问题