Вот нашел несколько полезных советов для M$ Visual Studio.
Кому интересно - оригинал
тут
Я приведу собственный перевод с моими комментариями.
1. Учим Visual Studio раскрывать структуры и классы в отладчике
Редактируем файл \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin. Его формат можно определить методом тыка, посмотрев уже существующие строки. (Там все не так уж и сложно. В начале файла есть немаленький комментарий про синтаксис. Насколько я понял, просто вместо древовидной структуры объекта или структуры будет показываться одно значение. Например, для CString - m_pchData - Прим. Great).
2. Добавляем слова для подсветки.
Если создать файл usertype.dat в каталоге \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin со словами по одному на строчку, то эти слова студия будет выделять синим цветом как ключевые. (Я уже добавил туда main и WinMain для удобства - Прим. Great).
3. Как использовать расширение *.cc для C++
Нужно произвести следующие изменения в реестре:
HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0 \Text Editor\Tabs/Language Settings\C/C++
FileExtensions=cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc; rc2;cc;cp
HKEY_USERS\S-1-5-21-1219703950-274334628-1532313055-1335\Software\Microsoft\DevStudio\6.0\Build System\Components\Platforms\Win32 (x86)\Tools\32-bit C/C++ Compiler for 80x86
Input_Spec=*.c;*.cpp;*.cxx,*.cc,*.cp
HKEY_USERS\S-1-5-21-1219703950-274334628-1532313055-1335\Software\Microsoft\DevStudio\6.0\Build System\Components\Tools\<Component 0x3>
Input_Spec=*.c;*.cpp;*.cxx;*.cc;*.cp
и добавить флаг /Tp к флагам компилятора в настройках проекта
4. Как закрепить меню.
В Visual Studio панель меню перемещаемая (об этом говорят две полосы слева). Если это мешает, это можно убрать, выставив галочку "Use screen reader compatible menus" в диалоговом окне Tools -> Options -> закладка Worspace
5. Напоминания при компиляции
Если у тебя плохо с памятью

и тебе сложно запомнить, например, что вот тот кусок кода в финальной версии желательно убрать или что в этом коде содержится некритичная проблема, можно сделать себе напоминание:
Код:
#define Stringize( L ) #L
#define MakeString( M, L ) M(L)
#define $Line MakeString( Stringize, __LINE__ )
#define Reminder __FILE__ "(" $Line ") : Reminder: "
использовать:
#pragma message(Reminder "Fix me!")
В результате компилятор сгенерирует при компиляции сообщение:
Compiling...
seh.cpp
H:\Progs\seh\seh.cpp(163) : Reminder: Fix me!
Linking...
seh.exe - 0 error(s), 0 warning(s)
6. Как сделать вручную точку останова
Просто поставить код
При нажатии на F5, когда выполнение дойдет до этого места, процессор сгенерирует исключение EXCEPTION_BREAKPOINT, отладчик его поймает и выведет сообщение - User breakpoint called from code at 0x...
7. Отладочные значения в различных областях памяти программы
0xCDCDCDCD Память выделена в куче, не инициализирована
0xDDDDDDDD Память, выделенная в куче, уже освобождена
0xFDFDFDFD Заполнитель NoMansLand записывается у границ участка памяти для контроля распространенного типа ошибки выхода за границы массива и переполнения. После затирании это указатели при освобождлении этой памяти free/delete выдаст диалоговое окно:
DAMAGE: after ТИП block (#номер) at 0xадрес., где ТИП - обычно Normal - тип освобождаемого участка, номер - номер блока.
Пример
неправильного кода:
Код:
char* a = new char[2];
strcpy(a, "aaaaaaaaaaaaaaaaaaaaa");
delete a;
Во время выполнения delete отладочная сборка программы выдаст окно "DAMAGE: after Normal block (#55) at 0x00430030".
0xCCCCCCCC Выделено в стеке, не инициализировано
8. Предопределенные псевдопеременные во время отладки
В окно Watch можно добавить следующие "переменные":
@err - последняя ошибка (GetLastError)
@tib - адрес Thread Information Block потока
@clk - время выполнения программы (мс)
9. Просмотр указателей как массивов
Обычно, если добавить в окно Watch переменную типа char*, она покажется как строка, а не как массив. Чтобы посмотреть отдельные элементы массива (например, чтобы узнать ASCII-код символа из этой строки), надо добавить в Watch выражение
переменная,длина, где переменная - переменная указательного типа, длина - за массив какой длины отладчик ее должен считать.
Например, пусть объявлен char* str;
Выражение
str,10 нам покажет всю строку + отдельно как массив ее первые 10 символов (в массиве - индексы 0-9).
Выражение
((char*)&main),100 покажет нам первые 100 байт машинного кода функции main
10. Вызов программных функций во время отладки
Если у тебя есть функция, например,
Код:
int function()
{
return 100*2;
}
а тебе хочется посмотреть, что бы она возвратила во время отладки, если бы стоял ее вызов в коде - нет проблем! Просто добавляем в окно Watch выражение
function() и сразу там появится значение 200
11. Именование потоков при отладке
Следущий код содержит функцию, позвляющую назвать поток с указанным ID'ом своим именем
Код:
#define MS_VC_EXCEPTION 0x406d1388
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in same addr space)
DWORD dwThreadID; // thread ID (-1 caller thread)
DWORD dwFlags; // reserved for future use, most be zero
} THREADNAME_INFO;
void SetThreadName(DWORD dwThreadID, LPCTSTR szThreadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = szThreadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(DWORD), (DWORD *)&info);
}
__except (EXCEPTION_CONTINUE_EXECUTION)
{
}
}
Имя потока появится в окне Debug->Threads.