nptrs = backtrace(buffer, SIZE);
标准backtrace
函数在 Tiny C 下不起作用,(它只返回一个地址)。如何在 Tiny C 编译程序中获取当前堆栈跟踪?
更新:
我尝试了在 git hub 上找到的这样的手动堆栈遍历,它再次仅适用于 GCC,但不适用于 Tiny:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define CALL_OFFSET 5
#define RELATIVE_ADDR_OFFSET 4
#define CALL_CMD 0xe8
extern uint8_t _start;
extern uint8_t _etext;
extern void *__libc_stack_end;
typedef uint8_t * pointer;
void stack_show() {
uint8_t shift = 1;
uint8_t stack_top = 0;
pointer ptr = &stack_top;
while((ptr + 3) <= (pointer)__libc_stack_end) {
uint32_t * lbs = (uint32_t *)ptr;
uint32_t * mbs = (uint32_t *)(ptr+3);
uint64_t addr = ((*(mbs))<<16) | *lbs;
if(addr > CALL_OFFSET &&
(addr - CALL_OFFSET) >= (uint64_t)&_start &&
addr < (uint64_t)&_etext) {
if(*(pointer)(addr - CALL_OFFSET) == CALL_CMD) {
uint64_t fun_addr = *(int*)(addr - RELATIVE_ADDR_OFFSET) + *(int*)ptr;
if(fun_addr >= (uint64_t)&_start && fun_addr < (uint64_t)&_etext)
printf("%016llx\n", fun_addr);
}
}
ptr += shift;
}
return;
}