我的程序中需要有一个用C ++编写并在ARM设备上运行的堆栈跟踪。我找不到任何可靠的方法来获得starcktrace,所以我决定编写自己的,尽可能简单,只是为了在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,而堆栈跟踪实现仅用于固定平台上的调试版本,没有跨平台或编译器问题)。我甚至可以解析一下将字符串拆分为函数名和函数参数名。但是如何在不了解它们的情况下打印所有函数参数:如类型或参数数量?像:
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);
...
}
P.S。如果您知道在ARMv6上运行程序时获得堆栈跟踪的更好方法,请告诉我(编译器:arm-openwrt-linux-uclibcgnueabi-gcc 4.7.3,libc:uClibc-0.9.33.2)
提前致谢。