summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Sebastian Valle2018-05-20 20:01:08 -0500
committerGravatar GitHub2018-05-20 20:01:08 -0500
commit882111c4f2a8ba25220e9b486abe5a24c2371c2e (patch)
treee256c590289d16e7ccfd0c0eb9627dafed54fd06 /src
parentMerge pull request #452 from Subv/psetp (diff)
parentQt/WaitTree: Display the callstack for each thread in the wait tree widget. (diff)
downloadyuzu-882111c4f2a8ba25220e9b486abe5a24c2371c2e.tar.gz
yuzu-882111c4f2a8ba25220e9b486abe5a24c2371c2e.tar.xz
yuzu-882111c4f2a8ba25220e9b486abe5a24c2371c2e.zip
Merge pull request #453 from Subv/thread_callstack
Qt/WaitTree: Display the callstack for each thread in the wait tree widget
Diffstat (limited to 'src')
-rw-r--r--src/yuzu/debugger/wait_tree.cpp26
-rw-r--r--src/yuzu/debugger/wait_tree.h11
2 files changed, 37 insertions, 0 deletions
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp
index 8b074db5a..017bef13c 100644
--- a/src/yuzu/debugger/wait_tree.cpp
+++ b/src/yuzu/debugger/wait_tree.cpp
@@ -98,6 +98,30 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeMutexInfo::GetChildren() cons
98 return list; 98 return list;
99} 99}
100 100
101WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {}
102
103QString WaitTreeCallstack::GetText() const {
104 return tr("Call stack");
105}
106
107std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeCallstack::GetChildren() const {
108 std::vector<std::unique_ptr<WaitTreeItem>> list;
109
110 constexpr size_t BaseRegister = 29;
111 u64 base_pointer = thread.context.cpu_registers[BaseRegister];
112
113 while (base_pointer != 0) {
114 u64 lr = Memory::Read64(base_pointer + sizeof(u64));
115 if (lr == 0)
116 break;
117 list.push_back(
118 std::make_unique<WaitTreeText>(tr("0x%1").arg(lr - sizeof(u32), 16, 16, QChar('0'))));
119 base_pointer = Memory::Read64(base_pointer);
120 }
121
122 return list;
123}
124
101WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {} 125WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {}
102 126
103bool WaitTreeExpandableItem::IsExpandable() const { 127bool WaitTreeExpandableItem::IsExpandable() const {
@@ -269,6 +293,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
269 thread.IsSleepingOnWaitAll())); 293 thread.IsSleepingOnWaitAll()));
270 } 294 }
271 295
296 list.push_back(std::make_unique<WaitTreeCallstack>(thread));
297
272 return list; 298 return list;
273} 299}
274 300
diff --git a/src/yuzu/debugger/wait_tree.h b/src/yuzu/debugger/wait_tree.h
index 300ba9ae4..10fc9e968 100644
--- a/src/yuzu/debugger/wait_tree.h
+++ b/src/yuzu/debugger/wait_tree.h
@@ -73,6 +73,17 @@ private:
73 Kernel::SharedPtr<Kernel::Thread> owner; 73 Kernel::SharedPtr<Kernel::Thread> owner;
74}; 74};
75 75
76class WaitTreeCallstack : public WaitTreeExpandableItem {
77 Q_OBJECT
78public:
79 explicit WaitTreeCallstack(const Kernel::Thread& thread);
80 QString GetText() const override;
81 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
82
83private:
84 const Kernel::Thread& thread;
85};
86
76class WaitTreeWaitObject : public WaitTreeExpandableItem { 87class WaitTreeWaitObject : public WaitTreeExpandableItem {
77 Q_OBJECT 88 Q_OBJECT
78public: 89public: