diff options
| author | 2018-05-20 20:01:08 -0500 | |
|---|---|---|
| committer | 2018-05-20 20:01:08 -0500 | |
| commit | 882111c4f2a8ba25220e9b486abe5a24c2371c2e (patch) | |
| tree | e256c590289d16e7ccfd0c0eb9627dafed54fd06 /src | |
| parent | Merge pull request #452 from Subv/psetp (diff) | |
| parent | Qt/WaitTree: Display the callstack for each thread in the wait tree widget. (diff) | |
| download | yuzu-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.cpp | 26 | ||||
| -rw-r--r-- | src/yuzu/debugger/wait_tree.h | 11 |
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 | ||
| 101 | WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {} | ||
| 102 | |||
| 103 | QString WaitTreeCallstack::GetText() const { | ||
| 104 | return tr("Call stack"); | ||
| 105 | } | ||
| 106 | |||
| 107 | std::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 | |||
| 101 | WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {} | 125 | WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {} |
| 102 | 126 | ||
| 103 | bool WaitTreeExpandableItem::IsExpandable() const { | 127 | bool 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 | ||
| 76 | class WaitTreeCallstack : public WaitTreeExpandableItem { | ||
| 77 | Q_OBJECT | ||
| 78 | public: | ||
| 79 | explicit WaitTreeCallstack(const Kernel::Thread& thread); | ||
| 80 | QString GetText() const override; | ||
| 81 | std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; | ||
| 82 | |||
| 83 | private: | ||
| 84 | const Kernel::Thread& thread; | ||
| 85 | }; | ||
| 86 | |||
| 76 | class WaitTreeWaitObject : public WaitTreeExpandableItem { | 87 | class WaitTreeWaitObject : public WaitTreeExpandableItem { |
| 77 | Q_OBJECT | 88 | Q_OBJECT |
| 78 | public: | 89 | public: |