- •Как работает отладчик
- •Точки останова
- •Отладочные символы
- •Настройка отладки
- •Запуск и прекращение отладки
- •Подключение к уже запущенному процессу
- •Завершение отладки
- •Точки останова
- •Закладка Location
- •Закладка Data
- •Закладка Messages
- •Пошаговая отладка
- •Окна отладчика
- •Окно Watch
- •Диалоги отладчика
Диалоги отладчика
Диалоги отладчика предоставляют ряд дополнительных возможностей. Все они вызываются из меню Debug.
Quick Watch
Этот диалог имеет возможности, аналогичные возможностям окна Watch, с той разницей, что в нём можно просматривать только одну переменную за раз. Используется, когда вам не хочется добавлять переменную в окно Watch. Его можно вызвать, используя комбинацию Shift+F9.
Exceptions
Этот диалог позволяет настроить реакцию отладчика на возникновение системных и пользовательских исключений. Для каждого исключения можно выбрать действие Stop always (останавливаться всегда) или Stop if not handled (останавливаться, если исключение не обработано).
Threads
Этот диалог показывает список потоков, созданных вашей программой. Позволяет приостановить (suspend) или продолжить (resume) любой поток, а также установить на него фокус (то есть сделать его текущим). Этот диалог – практически единственное средство для отладки многопоточных приложений, которое предоставляет Visual C++.
Modules
Этот диалог показывает список загруженных модулей. Для каждого модуля выводится диапазон адресов и имя файла.
#include <windows.h> #include <stdio.h>
typedef struct tagDEBUGHELPER { DWORD dwVersion; BOOL (WINAPI *ReadDebuggeeMemory)( struct tagDEBUGHELPER *pThis, DWORD dwAddr, DWORD nWant, VOID* pWhere, DWORD *nGot ); // from here only when dwVersion >= 0x20000 DWORDLONG (WINAPI *GetRealAddress)(struct tagDEBUGHELPER *pThis); BOOL (WINAPI *ReadDebuggeeMemoryEx)( struct tagDEBUGHELPER *pThis, DWORDLONG qwAddr, DWORD nWant, VOID* pWhere, DWORD *nGot ); int (WINAPI *GetProcessorType)(struct tagDEBUGHELPER *pThis); } DEBUGHELPER;
extern "C" __declspec(dllexport) HRESULT WINAPI MyRectFormat( DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved ) { RECT rc; DWORD dwGot; pHelper->ReadDebuggeeMemory( pHelper, dwAddress, sizeof(rc), &rc, &dwGot);
if(dwGot != sizeof(rc)) return E_FAIL;
sprintf( pResult, "width=%d; height=%d", rc.right-rc.left, rc.bottom-rc.top );
return S_OK; }
BOOL APIENTRY DllMain(HANDLE, DWORD, LPVOID) { return TRUE; } |
