backtrace.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-07-28 JasonHu first version
  9. */
  10. #include <rtthread.h>
  11. #include <backtrace.h>
  12. static int rt_hw_backtrace(void **buffer, int size)
  13. {
  14. int i = 0;
  15. int n = 0;
  16. unsigned int _ebp = 0;
  17. unsigned int _eip = 0;
  18. __asm__ __volatile__(" movl %%ebp, %0" :"=g" (_ebp)::"memory");
  19. for(i = 0; i < size && _ebp != 0 && *(unsigned int*)_ebp != 0 &&
  20. *(unsigned int *)_ebp != _ebp; i++) {
  21. _eip = (unsigned int)((unsigned int*)_ebp + 1);
  22. _eip = *(unsigned int*)_eip;
  23. _ebp = *(unsigned int*)_ebp;
  24. buffer[i] = (void*)_eip;
  25. n++;
  26. }
  27. return n;
  28. }
  29. void rt_hw_print_backtrace(void)
  30. {
  31. void *buf[BACKTRACE_CNT] = {RT_NULL};
  32. int cnt = rt_hw_backtrace(buf, BACKTRACE_CNT);
  33. rt_kprintf("[!] Call backtrace:\n");
  34. int i;
  35. for (i = 0; i < cnt; i++)
  36. {
  37. rt_kprintf("%d: call %p\n", i, buf[i]);
  38. }
  39. rt_kprintf("[!] Call backtrace done.\n");
  40. }