libunwind_cursor.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "libunwind_cursor.h"
  2. namespace NYT::NBacktrace {
  3. ////////////////////////////////////////////////////////////////////////////////
  4. TLibunwindCursor::TLibunwindCursor()
  5. {
  6. if (unw_getcontext(&Context_) != 0) {
  7. Finished_ = true;
  8. return;
  9. }
  10. Initialize();
  11. }
  12. TLibunwindCursor::TLibunwindCursor(const unw_context_t& context)
  13. : Context_(context)
  14. {
  15. Initialize();
  16. }
  17. void TLibunwindCursor::Initialize()
  18. {
  19. if (unw_init_local(&Cursor_, &Context_) != 0) {
  20. Finished_ = true;
  21. return;
  22. }
  23. ReadCurrentIP();
  24. }
  25. bool TLibunwindCursor::IsFinished() const
  26. {
  27. return Finished_;
  28. }
  29. const void* TLibunwindCursor::GetCurrentIP() const
  30. {
  31. return CurrentIP_;
  32. }
  33. void TLibunwindCursor::MoveNext()
  34. {
  35. if (Finished_) {
  36. return;
  37. }
  38. if (unw_step(&Cursor_) <= 0) {
  39. Finished_ = true;
  40. return;
  41. }
  42. ReadCurrentIP();
  43. }
  44. void TLibunwindCursor::ReadCurrentIP()
  45. {
  46. unw_word_t ip = 0;
  47. if (unw_get_reg(&Cursor_, UNW_REG_IP, &ip) < 0) {
  48. Finished_ = true;
  49. return;
  50. }
  51. CurrentIP_ = reinterpret_cast<const void*>(ip);
  52. }
  53. ////////////////////////////////////////////////////////////////////////////////
  54. } // namespace NYT::NBacktrace