#pragma once #include "DebuggerUI.h" #define STACKTRACE_MAX_ENTRIES 100 typedef struct { uint32_t routineAddress; uint32_t callingAddress; } STACKTRACE_ENTRY; class CDebugStackTrace : public CDebugDialog, public CDialogResize, private CDebugSettings { public: enum { IDD = IDD_Debugger_StackTrace }; CDebugStackTrace(CDebuggerUI * debugger); virtual ~CDebugStackTrace(void); void Refresh(); inline void PushEntry(uint32_t routineAddress, uint32_t callingAddress) { if (m_EntriesIndex < STACKTRACE_MAX_ENTRIES) { m_Entries[m_EntriesIndex] = { routineAddress, callingAddress }; m_EntriesIndex++; } } inline void PopEntry() { if (m_EntriesIndex > 0) { m_EntriesIndex--; } } inline void ClearEntries() { m_EntriesIndex = 0; } private: STACKTRACE_ENTRY m_Entries[STACKTRACE_MAX_ENTRIES]; int m_EntriesIndex; CListViewCtrl m_List; LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnListDblClicked(NMHDR* pNMHDR); LRESULT OnDestroy(void); void OnExitSizeMove(void); BEGIN_MSG_MAP_EX(CDebugStackTrace) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MSG_WM_DESTROY(OnDestroy) MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked) NOTIFY_HANDLER_EX(IDC_STACKTRACE_LIST, NM_DBLCLK, OnListDblClicked) CHAIN_MSG_MAP(CDialogResize) MSG_WM_EXITSIZEMOVE(OnExitSizeMove) END_MSG_MAP() BEGIN_DLGRESIZE_MAP(CDebugStackTrace) DLGRESIZE_CONTROL(IDC_STACKTRACE_LIST, DLSZ_SIZE_X | DLSZ_SIZE_Y) END_DLGRESIZE_MAP() };