Активация команд-лайна с настройками всех PATH-ов, для работы со студийными бинарниками из комнад лайна
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86
• Меню "Tools"->"External Tools...". Появится диалог с текущими внешними утилитами
• В диалоге нажмите "Add" и в поле "Title" введите любое удобное для вас имя (оно используется в меню)
• Остальные поля заполните в соответствии с инструкциями
• В окне брейкпоинтов создаём брейкпоинт New->Break at Function
• Указываем функцию к примеру так
{,,kernel32.dll}_CreateProcessW@40
{,,kernel32.dll}_WriteConsole@20
{,,kernel32.dll}_VirtualAlloc@16
{,,user32.dll}_VSetWindowText@8
В таком виде задаётся dll, которая экспортирует эту функцию и имя функции которая используется
• В asm-коде функции просмотр параметров функции на стеке при отладке 32-ух разрядного бинарника можно сделать к примеру через регистр EBP
• esp 0x00287eac unsigned long
• ebp 0x0028d318 unsigned long
• *((int*)(ebp+8)) 0x0028e288 int
• *((int*)(ebp+12)) 0x0a83a540 int
• *((int*)(ebp+16)) 0x680a6c14 int
• *((int*)(ebp+20)) 0x680a6c14 int
• *((int*)(ebp+24)) 0x00000001 int
(аргументы от первого до пятого. Предполгается что размер каждого аргумента равен 4-ём байтам)
Пример breakpoint-ов:
{,,kernel32.dll}_ReadFile@40
Восстановление привычной панели с вкладками исходников
Требуется выбрать Tools -> Options... -> Enviroment -> General -> Window Layout -> Tabbed documents
1. Показывание номеров линий Tools->Options->Text Editor->All languages->General->Line numbers
2. Подсветка пробелов(табов) - CTRL+R, CTRL+W
https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#History
Открыв документ, выполнить действия CTR+A, CTR+K, CTR+F.
lib /list ILU.lib
dumpbin /symbols test.lib
dumpbin /headers calc.exe | grep stack
dumpbin /symbols teeeest.obj
dumpbin /headers test.exe (http://en.wikipedia.org/wiki/Data_segment)
dumpbin /exports a.dll
или гуёвая dllexp.exe (http://www.nirsoft.net/utils/dll_export_viewer.html) она в том числе умеет раздекларировать имена C++ методов.
В опциях компилятора есть /showIncludes. В этом случае при компиляции исходника будет напечатано дерево инклудов в порядке depth-first-search.
http://msdn.microsoft.com/en-us/library/hdkef6tk.aspx
Дамп собранных бинарников относительно адресов загрузки символов и т.д.
Relative virtual address. In an image file, the address of an item after it is loaded into memory, with the base address of the image file subtracted from it. The RVA of an item almost always differs from its position within the file on disk (file pointer).
Module's preferred image base address
C:\Windows\SysWOW64>dumpbin /headers kernel32.dll | grep "image base"
7DD60000 image base (7DD60000 to 7DE6FFFF)
Target machine for PE file
dumpbin /headers some.exe | grep machine
Данная программа предназначена для отладки программ находящихся на другом компьютере. Ее необходимо установить на компьютере с отлаживаемой программой. Следует отметить, что обычному пользователю (не из административной группы) запрещено проводить отладку (т.е. запустить под ним программу не получится). Чтобы дать такую возможность необходимо:
#1. Запустить Start->Programs->Administrative Tools->Local Security Policy
В "Local Security Policy\Local Policies\User Rights Assignment\Debug Programs" добавить нужного пользователя или группу. Возможно потребуется перезагрузка системы
#2. Все необходимые файлы находятся в установленном дистрибутиве в каталоге
"Program Files\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\x86".
Содержимое данной папки и необходимо скопировать на машину, программу на которой вы собираетесь отлаживать.
#3. Процедуру запуска программы можно оптимизировать, чтобы программа запускалась в один клик (в противном случае придется каждый раз ее настраивать).
Для этого создайте в каталоге с программой файл run.bat со следующим содержимым:
start /B msvsmon.exe /noauth /anyuser /nosecuritywarn /timeout 100000000 /nostatus
Теперь при щелчке на данный файл будет запускаться программа с необходимыми настройками.
((float*)fp), 10 -- имея один указатель посмотреть массив значений. К сожалению приведение к абстрактному описателю ((float (*)[10])fp) не работает для окна watch, но прекрасно понимается компилятором.
@err,hr -- код и описание последней ошибки в текущем потоке. GetLastError.
$tid -- ид текущего потока. См. так же https://msdn.microsoft.com/en-us/library/ms164891.aspx
Печать сообщения в окно сборки проекта, без останова сборки
#pragma message("message") https://msdn.microsoft.com/ru-ru/library/x7dkzch2.aspx
https://msdn.microsoft.com/en-us/library/b0084kay.aspx
По правилу языка С predefined макросы не могут быть забыты или переопределены программистом (#undef, #define).
Однако какая-та часть из этих определенный макросов в Visual Studio и её компиляторе+препроцессоре может быть забыта, какая-та не может быть забыта.
eip -- адрес следующей команды, напрямую менять нельзя.
стек растёт вниз, на верхушке стека находится последний запушенный элемент.
push eax <=> sub esp, 4; mov [esp], eax
pop eax <=> mov eax, [esp]; add esp, 4;
Часто требуется возможность быстро приконнектится к процессу с каким-нибудь именем из Visual Studio. Можно, конечно, каждый раз, через пункт меню Tools->Attach to Process, искать необходимый процесс, но гораздо лучше с помощью клавиатурной комбинации вызывать автоматический аттач к процессу с определенным именем.
Последовательность действий:
1. Добавление макроса
Меню Tools->Macros->Macros IDE. В открывшемся окне слева видим MyMacros и Samples, щелокаем по последнему - появляются пункты Accessibility, AddDirAsSlnFolder, DevStudio6Editor. Выбираем какой из этих модулей наиболее соответствует нашему макросу (также можно создать свой отдельный модуль). Копируете в выбранный модуль макрос:
Sub AttachToLocalProcess() Dim processToAttachTo As String = "debugging_process.exe" Dim attached As Boolean = False Dim proc As EnvDTE.Process For Each proc In DTE.Debugger.LocalProcesses If (Right(proc.Name, Len(processToAttachTo)) = processToAttachTo) Then proc.Attach() attached = True Exit For End If Next If attached = False Then MsgBox(processToAttachTo + " is not running") End If End Sub
2. Привязка к макросу клавиатурной комбинации
Меню "Tools->Options". В открывшемся окне перейти на Environment->Keyboard. В поле "Show commands containing:" введите часть названия вашего макроса. После чего выберете его в нижнем списке.Далее установите курсор в пункте "Press shotcut keys:" и нажмите комбинацию, с помощью которой вы хотите запускать макрос. Если эта комбинация уже используется - в поле "Currently assigned" появится название ее владельца, в противном случае - "unassigned". Для подтверждения назначения новой клавишной комбинации нажмите кнопку "Assign".
Часто требуется возможность быстро приаттачится к процессу с некоторым именем, запущенному на виртуальной машине или другом компьютере, из Visual Studio (на удаленной машине, естественно, должен быть запущен удаленный отладчик msvsmon). Можно, конечно, каждый раз, через пункт меню Tools->Attach to Process, выбрать машину и найти необходимый процесс (и делать так каждый раз), но гораздо лучше с помощью клавиатурной комбинации вызывать автоматический аттач к процессу с определенным именем.
Последовательность действий:
1)Добавление макроса. Меню Tools->Macros->Macros IDE. В открывшемся окне слева видим MyMacros и Samples, щелокаем по последнему - появляются пункты Accessibility, AddDirAsSlnFolder, DevStudio6Editor. Выбираем какой из этих модулей наиболее соответствует нашему макросу (также можно создать свой отдельный модуль). Копируете в выбранный модуль макрос.
Sub AttachToRemoteProcess() Dim machine As String = "name or ip-address" Dim processToAttachTo As String = "debug_process.exe" Dim dbg As EnvDTE80.Debugger2 = DTE.Debugger Dim transport As EnvDTE80.Transport = dbg.Transports.Item("Remote") Dim proc As EnvDTE80.Process2 Dim attached As Boolean = False For Each proc In dbg.GetProcesses(transport, machine) If (Right(proc.Name, Len(processToAttachTo)) = processToAttachTo) Then proc.Attach2() attached = True Exit For End If Next If attached = False Then MsgBox(processToAttachTo + " is not running") End If End Sub
Привязка к макросу клавиатурной комбинации
Меню "Tools->Options". В открывшемся окне перейти на Environment->Keyboard. В поле "Show commands containing:" введите часть названия вашего макроса. После чего выберете его в нижнем списке.Далее установите курсор в пункте "Press shotcut keys:" и нажмите комбинацию, с помощью которой вы хотите запускать макрос. Если эта комбинация уже используется - в поле "Currently assigned" появится название ее владельца, в противном случае - "unassigned". Для подтверждения назначения новой клавишной комбинации нажмите кнопку "Assign".
Динамические библиотеки с реализованной функциональностью по отладке
dbghelp.dll использует dbgeng.dll
dbghelp.dll
1) Дамп процесса
2) Получение stack trace
3) Информация про исполняемый файл
dbgeng.dll ставится в настройками в Custom Installation IDDebugAdvanced, IDebugControl, IDebygSystemObjects
Зачем нужны отладочные символы
1) Отображение сырого адреса в исполняемом файле на строчку кода
2) Информация с анализом данных по приложению
3) Внутренний формат pdb Microsoft не документируется.
Виды отладочной информации
1) Публичные функции и переменные
2) Отображения стектрейса, даже в случае компиляции с флагом Frame Pointer Omission
3) Значение переменных
4) Информация по именам исходных файлов и номерам строк
5) Информация по типам переменных
3-4-5 не содержится в pdb если использовать /pdbstripped
Хранение pdb файлов
Для отладочной инфы по static lib можно использовать /Z7 чтобы всунуть дебажную инфу в lib файл
Во время построения приложения сигнатура записывается в бинарник и в pdb файл.
Ищутся символы в папочке с image, имя указанное внутри PE файла в заголовке NB10 или RSDS, _NT_SYMBOL_PATH, _NT_ALT_SYMBOL_PATH,
Популярные команды
...
Флажки компилятора:
/FA - генерировать листинг
Сборка, или запуск:
Tools =>Options=>Projects and Solutions=>Build and Run. "On Run, when projects are out of date" is equal to Always build.