- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自 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: ...”,我认为是答案。
最佳答案
我的最终目标是转储用户空间堆栈。
在网上google了这么多资料,我发现有4种方法:
ptrace: http://en.wikipedia.org/wiki/Ptrace
ptrace真的很难用,需要先把线程停掉再用ptrace attach
_unwind_backtrace:CallStack使用的方式(CallStack.cpp中的CallStack类)
它有一个缺点:如果你在线程处理信号时使用它,它会转储信号堆栈而不是转储线程堆栈
同样的问题:How to get fullstacktrace using _Unwind_Backtrace on SIGSEGV
回溯: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
转储用户空间线程堆栈的补丁: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/
我已经开始使用 Doxygen(预编译 1.8.14)为我在 Windows 10 上的 C++ 项目生成简单的代码文档。 在一个头文件中,我定义了三个模板函数,我的定义放在一个包含在头文件末尾的 .
在编写模板类时,我喜欢将实现移动到不同的文件(myclass.tpp)中,并将其包含在主标题的底部(myclass.hpp)。 我的问题是:我需要在 .tpp 文件中包含守卫,还是在 .hpp 文件中
我想将图像放在 tpp 中推介会。我正在使用下面的代码来显示图像 --exec shotwell Desktop/a.png 但是,当我运行 tpp filename.tpp 时,它会向我显示以下错误
请引用this question about implementing templates.中第一个答案 具体来说,请注意这句话 A common solution to this is to wri
来自 https://stackoverflow.com/a/11467040/1442443 的问题 我的最终目标是转储用户空间堆栈。 我尝试将如下所示的 cpp 文件构建为 android 平台上
我在 Linux 环境 (Redhat) 上安装 TPP 软件时遇到了一些问题。错误信息如下所示: perl -c -I ../../build/RedHat-x86_64 ../../build
我正在 Visual Studio 2013 Express 中实现一个带有头文件和实现文件的类模板。但是,我的实现文件(具有 .tpp 扩展名)没有启用 IntelliSense。有没有办法为这个文
我是一名优秀的程序员,十分优秀!