ThreadStackWidget.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "ThreadStackWidget.h"
  7. #include <AK/ByteBuffer.h>
  8. #include <LibCore/Timer.h>
  9. #include <LibGUI/BoxLayout.h>
  10. #include <LibSymbolication/Symbolication.h>
  11. ThreadStackWidget::ThreadStackWidget()
  12. {
  13. set_layout<GUI::VerticalBoxLayout>();
  14. layout()->set_margins({ 4, 4, 4, 4 });
  15. m_stack_editor = add<GUI::TextEditor>();
  16. m_stack_editor->set_mode(GUI::TextEditor::ReadOnly);
  17. }
  18. ThreadStackWidget::~ThreadStackWidget()
  19. {
  20. }
  21. void ThreadStackWidget::show_event(GUI::ShowEvent&)
  22. {
  23. refresh();
  24. if (!m_timer)
  25. m_timer = add<Core::Timer>(1000, [this] { refresh(); });
  26. }
  27. void ThreadStackWidget::hide_event(GUI::HideEvent&)
  28. {
  29. m_timer = nullptr;
  30. }
  31. void ThreadStackWidget::set_ids(pid_t pid, pid_t tid)
  32. {
  33. if (m_pid == pid && m_tid == tid)
  34. return;
  35. m_pid = pid;
  36. m_tid = tid;
  37. }
  38. void ThreadStackWidget::refresh()
  39. {
  40. auto symbols = Symbolication::symbolicate_thread(m_pid, m_tid);
  41. StringBuilder builder;
  42. for (auto& symbol : symbols) {
  43. builder.appendff("{:p}", symbol.address);
  44. if (!symbol.name.is_empty())
  45. builder.appendff(" {}", symbol.name);
  46. builder.append('\n');
  47. }
  48. if (m_stack_editor->text() != builder.string_view()) {
  49. m_stack_editor->set_text(builder.string_view());
  50. }
  51. }