Serenity Operating System
1/*
2 * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Vector.h>
10#include <LibDebug/ProcessInspector.h>
11#include <LibGUI/ListView.h>
12#include <LibGUI/Model.h>
13#include <sys/arch/regs.h>
14
15namespace Debug {
16
17class DebugSession;
18
19}
20
21namespace HackStudio {
22
23class BacktraceModel final : public GUI::Model {
24public:
25 static NonnullRefPtr<BacktraceModel> create(Debug::ProcessInspector const&, PtraceRegisters const& regs);
26
27 virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return m_frames.size(); }
28 virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return 1; }
29
30 virtual DeprecatedString column_name(int) const override
31 {
32 return "";
33 }
34
35 virtual GUI::Variant data(const GUI::ModelIndex&, GUI::ModelRole) const override;
36
37 virtual GUI::ModelIndex index(int row, int column, const GUI::ModelIndex&) const override;
38
39 struct FrameInfo {
40 DeprecatedString function_name;
41 FlatPtr instruction_address { 0 };
42 FlatPtr frame_base { 0 };
43 Optional<Debug::DebugInfo::SourcePosition> m_source_position;
44 };
45
46 Vector<FrameInfo> const& frames() const { return m_frames; }
47
48private:
49 explicit BacktraceModel(Vector<FrameInfo>&& frames)
50 : m_frames(move(frames))
51 {
52 }
53
54 static Vector<FrameInfo> create_backtrace(Debug::ProcessInspector const&, PtraceRegisters const&);
55
56 Vector<FrameInfo> m_frames;
57};
58
59}