callstack.cc 725 B

12345678910111213141516171819202122232425262728293031
  1. #include "callstack.h"
  2. struct stack_frame {
  3. struct stack_frame* next;
  4. void* ret;
  5. };
  6. extern void *__libc_stack_end;
  7. int get_call_stack_from(void** retaddrs, int max_size, void* sp, void* bp)
  8. {
  9. /* find the frame pointer */
  10. struct stack_frame* frame = (struct stack_frame*)bp;
  11. void* top_stack = sp;
  12. /* the rest just walks through the linked list */
  13. int i = 0;
  14. while(i < max_size)
  15. {
  16. if(frame < top_stack || frame > __libc_stack_end)
  17. break;
  18. retaddrs[i++] = frame->ret;
  19. frame = frame->next;
  20. }
  21. return i;
  22. }
  23. int get_call_stack(void** retaddrs, int max_size)
  24. {
  25. int stack_top;
  26. return get_call_stack_from(retaddrs, max_size, &stack_top, __builtin_frame_address(0));
  27. }