我正在尝试获取调用堆栈,由于某种原因,以下代码返回错误的堆栈指针:
unsigned int stack_pointer = 0;
__asm("la $26, %[spAddr]\n\t"
"or $27, $0, $sp\n\t"
"sw $27, 0($26)\n\t"
"nop"::[spAddr] "m" (stack_pointer));
return stack_pointer;
我在这里缺少什么?
答案 0 :(得分:3)
要获取堆栈指针,请使用正确的输出约束,如下所示:
register unsigned sp asm("29");
asm("" : "=r" (sp));
请注意,mips使用寄存器作为返回地址,但当然非叶函数可能会将其存储在堆栈中。
要实现回溯,您可以使用内置__builtin_return_address
和__builtin_extract_return_addr
,如gcc manual中所述。
此外,如果glibc可用,它已具有backtrace
功能,请参阅man backtrace。