回溯函数只得到最后一帧

时间:2018-04-19 08:15:40

标签: c gdb mips

我想调用backtrace函数来获取callchain,以下是我的代码,这段代码在x86上运行良好,但不能在mips上工作

mips-linux-gnu-gcc -o hello hello.c -g -rdynamic -O0 -Wall -msoft-float -EL
./hello
size = 1
0x400a04 : ./hello(foo+0x24) [0x400a04]

但是在mips上,只是得到了最后一帧,如何修复它?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <execinfo.h>

#define BACKTRACE_SIZ 100

int i = 0;

void foo(void)
{
    void *array[BACKTRACE_SIZ];
    size_t size, i;
    char **strings;

    size = backtrace(array, BACKTRACE_SIZ);
    strings = backtrace_symbols(array, size);

    printf("size = %ld\n", (long)size);
    for (i = 0; i < size; ++i) {
        printf("%p : %s\n", array[i], strings[i]);
    }

    free(strings);

    while (1) {
        i++;
    }
}

void b(void)
{
    foo();
}

void a(void)
{
    b();
}

int main(int argc, char **argv)
{
    a();
    return 0;
}

无法获得b和a和main。但是我可以在gdb中得到完整的callchain,为什么不能通过backtrace函数得到它? 我的工具链是codesourcery mips-2016.05,libc版本是2.23

mips-linux-gnu-gcc -o hello hello.c -g -rdynamic -O0 -Wall -msoft-float -EL -fomit-frame-pointer
mips-linux-gnu-gcc -o hello hello.c -g -rdynamic -O0 -Wall -msoft-float -EL -fno-omit-frame-pointer

我试过-fno-omit-frame-pointer和-fomit-frame-pointer,这两个选项都无法正常工作。

index_a

我尝试了我的扶手板,更糟糕的是,手臂上的尺寸为0

0 个答案:

没有答案