相关疑难解决方法(0)

如何在C中手动迭代堆栈帧?

在处理应用程序中的信号时,我可以在调试器中正确看到backtrace。但是backtrace系统调用未正确显示堆栈帧.gdb存储堆栈帧的方式和backtrace系统调用如何转储它们之间有区别吗?

c linux gcc gdb backtrace

2
推荐指数
1
解决办法
955
查看次数

为什么 __builtin_return_address 在 Clang 中崩溃?

我有以下 C/C++ 代码,它使用__builtin_return_address

#include <stdio.h>

#ifdef __clang__
# define optnone __attribute__((optnone))
#else
# define optnone __attribute__((optimize("O0")))
#endif

void *f() {
    return __builtin_extract_return_addr(__builtin_return_address(2));
}

optnone void nest1() {
    printf("%p\n", f());
}

optnone void nest2() {
    nest1();
}

optnone void nest3() {
    nest2();
}

optnone void nest4() {
    nest3();
}

optnone int main() {
    nest4();
}
Run Code Online (Sandbox Code Playgroud)

GCC生成以下程序集并且工作正常(不会崩溃):

f:
        push    rbp
        mov     rbp, rsp
        mov     rax, QWORD PTR [rbp+0]
        pop     rbp
        mov     rax, QWORD PTR [rax]
        mov     rax, QWORD …
Run Code Online (Sandbox Code Playgroud)

c assembly callstack clang backtrace

0
推荐指数
1
解决办法
328
查看次数

标签 统计

backtrace ×2

c ×2

assembly ×1

callstack ×1

clang ×1

gcc ×1

gdb ×1

linux ×1