gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:07:14 25 4
gpt4 key购买 nike

来自 https://stackoverflow.com/a/11467040/1442443 的问题

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

我尝试将如下所示的 cpp 文件构建为 android 平台上的可执行文件。因此,通过调用 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

但我总是收到错误消息:

error: undefined reference to 'android::CallStack::CallStack()'

error: undefined reference to 'android::CallStack::update(int, int)'

...

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

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

更新1

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

更新2

我的控制台中有一些关键字“target StaticExecutable: ...”,我认为是答案。

http://en.wikipedia.org/wiki/Static_executable

最佳答案

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

在网上google了这么多资料,我发现有4种方法:

  1. ptrace: http://en.wikipedia.org/wiki/Ptrace

    ptrace真的很难用,需要先把线程停掉再用ptrace attach

  2. _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

    它有一个缺点:如果你在线程处理信号时使用它,它会转储信号堆栈而不是转储线程堆栈

    同样的问题:How to get fullstacktrace using _Unwind_Backtrace on SIGSEGV

  3. 回溯:http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

    一个GNU扩展函数,Android使用的Bionic libc中没有实现

    引用:https://stackoverflow.com/a/8295238/1442443

    引用:http://lists.puredata.info/pipermail/pd-list/2012-02/094258.html

  4. 转储用户空间线程堆栈的补丁:http://www.gossamer-threads.com/lists/linux/kernel/1525096

    但只能在X86架构下实现...orz

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

所以... 2 是答案。

但是,我想知道是否有人可以解决这个问题:How to get fullstacktrace using _Unwind_Backtrace on SIGSEGV

更新:

如果你可以使用交叉编译器来使用 glic 来编译你的代码,也许你可以使用 3. backtrace ! http://communities.mentor.com/community/cs/archives/arm-gnu/msg02514.html

更新2好文章

http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html

关于android - 如何在 android 平台上的可执行文件中使用 CallStack(在 CallStack.tpp 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com