首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在安卓平台上的可执行文件中使用CallStack (在CallStack.tpp中)?

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

Stack Overflow用户
提问于 2012-07-13 12:05:48
回答 3查看 6.7K关注 0票数 3

https://stackoverflow.com/a/11467040/1442443的一个问题

我的最后一个目标是转储用户空间堆栈.

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

代码语言:javascript
复制
#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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-18 09:30:02

我的最后一个目标是转储用户空间堆栈

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

  1. ptracehttp://en.wikipedia.org/wiki/Ptrace 使用ptrace真的很难,在使用ptrace附加之前,我们需要停止线程。

  1. _unwind_backtrace:-- CallStack (CallStack.cpp中的CallStack类)使用的方法 示例:http://git.stlinux.com/?p=stm/uclibc.git;a=blob;f=libubacktrace/sysdeps/sh/backtrace.c;h=18b91b1bb3fa26344a521927c631553a410fcf56;hb=d6a3d9ece5922a337800a8e2ed4db7e226f9ccb3 它有一个缺点:如果您使用它作为线程正在处理的信号,它将转储信号堆栈而不是转储线程堆栈。 同样的问题:Backtrace on SIGSEGV

  1. 反向跟踪node/Backtraces.html 一个GNU扩展函数,不是在Android使用的仿生libc中实现的。 参考资料:https://stackoverflow.com/a/8295238/1442443 参考资料:http://lists.puredata.info/pipermail/pd-list/2012-02/094258.html

  1. 用于转储用户空间线程堆栈http://www.gossamer-threads.com/lists/linux/kernel/1525096的修补程序 但只能在X86架构中实现.orz 我试着把它移植到android,不,它只显示第一帧堆栈,因为arm不使用框架指针。

所以..。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

票数 6
EN

Stack Overflow用户

发布于 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/

票数 0
EN

Stack Overflow用户

发布于 2017-07-30 15:55:19

我也收到了这个错误,但是我补充说:

代码语言:javascript
复制
LOCAL_STATIC_LIBRARIES += libutils 

三个目标的LOCAL_MODULE := xxx前行在vm/Android.m中添加

代码语言:javascript
复制
LOCAL_SHARED_LIBRARIES += libcorkscrew

vm/Android.mk

libdex/Android.mkdexlist/Android.mkdexdump/Android.mk也是一样

这些都做完了,对我来说很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11470190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档