ARM的自定义堆栈跟踪实现

时间:2013-12-16 14:12:00

标签: c++ macros embedded arm

我的程序中需要有一个用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)

提前致谢。

0 个答案:

没有答案