nptrs = backtrace(buffer, SIZE);
Standard backtrace
function does not work under Tiny C, (it only returns a single address). How do you get a current stack trace in a Tiny C compiled program?
Update:
I tried manual stack walk like this found on git hub, again it only works on GCC but not under 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;
}