在Raspberry Pi上,backtrace()返回0帧

 XIE绍雄 发布于 2023-01-03 16:12

我正在玩glibc's backtrace(),我似乎无法让它在我的Raspberry Pi上正常工作.一切都没有警告编译,但backtrace()返回0作为存储的帧数.完全相同的代码确实在x86_64(Debian stable)上产生了回溯,backtrace()返回6帧:


/*test.c*/
#include 
#include 
#include 

void foo(void)
{
    void *stack[10];
    int n = backtrace(stack, 10);
    fprintf(stderr, "Last %d frames:\n", n);
    backtrace_symbols_fd(stack, n, STDERR_FILENO);
}

void bar(void)
{
    foo();
}

void baz(void)
{
    bar();
}

int main(void)
{
    printf("Hello, Backtrace\n");
    baz();
    return 0;
}

#Makefile
CFLAGS=-Wall -Wextra -g
LDFLAGS=-rdynamic

x86_64上的输出(gcc (Debian 4.7.2-5) 4.7.2使用GNU libc6:amd64 2.13-38+deb7u1):

Hello, Backtrace
Last 6 frames:
./test(foo+0x19)[0x4009a5]
./test(bar+0x9)[0x4009e5]
./test(baz+0x9)[0x4009f0]
./test(main+0x13)[0x400a05]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7f9286ddbead]
./test[0x4008a9]

Raspberry Pi上的输出(gcc (Debian 4.6.3-14+rpi1) 4.6.3使用GNU libc6:armhf (2.13-38+rpi2+deb7u1)):

Hello, Backtrace
Last 0 frames:

我已经验证Raspberry Pi上编译的可执行文件正在将帧指针和链接寄存器存储到堆栈中.objdump -d test摘抄:

0000882c :
    882c:       e92d4800        push    {fp, lr}
    8830:       e28db004        add     fp, sp, #4
    8834:       ebffffe3        bl      87c8 
    8838:       e8bd8800        pop     {fp, pc}

0000883c :
    883c:       e92d4800        push    {fp, lr}
    8840:       e28db004        add     fp, sp, #4
    8844:       ebfffff8        bl      882c 
    8848:       e8bd8800        pop     {fp, pc}

我在论坛或Stack Overflow上找不到这样的东西.难道我做错了什么?我没有检查过什么?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有