ARM的自定义堆栈跟踪实现
Custom stacktrace implementation for ARM
我的程序中需要一个用C++编写并在ARM设备上运行的堆栈。我找不到任何可靠的方法来获得starktrace,所以我决定写一个尽可能简单的自己的方法,只是为了在gdb中获得类似stacktrace的东西。
这里有一个想法:编写一个宏来推送FUNCTION
和__PRETTY_FUNCTION__
。有几个问题:
想想我有这样一个宏:
#define STACKTRACE_ENTER_FUNC
... lock mutex
... push info into the global list
... set scope-exit handler to delete info at function exit
... unlock mutex
现在我需要将这个宏放在代码中的每个函数中。但是他们太多了。有没有更好的方法来实现这个目标,或者我真的应该改变每个函数来包含这个宏:
void foo()
{
STACKTRACE_ENTER_FUNC;
...
}
void bar()
{
STACKTRACE_ENTER_FUNC;
...
}
下一个问题是:我可以使用__PRETTY_FUNCTION__
(因为我们只使用固定版本的gcc,而stacktrace实现仅用于在固定平台上调试构建,没有跨平台或编译器问题)。我甚至可以对它进行一点解析,将字符串拆分为函数名和函数参数名。但是,我如何在不了解太多的情况下打印所有函数参数:比如参数的类型或数量?类似:
int foo(char x, float y)
{
PRINT_ARGS("arg1", "arg2"); // Gives me the string: "arg1 = 'A', arg2 = 13.37"
...
}
int main()
{
foo('A', 13.37);
...
}
附言:如果你知道在ARMv6上运行程序时获取堆栈跟踪的更好方法,请告诉我(编译器:arm-openwrt-linux-uclebcgnueabi-gcc 4.7.3,libc:uClibc-0.9.33.2)
提前谢谢。
更简单的解决方案是下拉到汇编-无论如何,C++级别上都不存在堆栈跟踪。
从程序集的角度来看,您使用函数地址的映射(任何链接器都可以生成)。当前指令指针标识顶部帧,返回地址标识调用堆栈。棘手的部分是尾调用优化,这有点哲学(你想要逻辑调用堆栈还是实际调用堆栈?)
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 光线跟踪器灯光反射错误
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 我的 A* 实现无法正确跟踪"camefrom"映射
- ARM的自定义堆栈跟踪实现
- 光线跟踪器-实现阴影
- 如何为在 .props 文件中声明的非本机 VC 编译器 (GCC) 实现 MSBUILD 文件跟踪功能 (跟踪器.ex
- 实现对象跟踪,如在 Boost::Serialization 中
- 实现自定义malloc(),可以在c++中跟踪分配位置
- 队列实现失去了对头节点的跟踪