Можно ли использовать возможности аппаратной трассировки ветвлений и исключений Pentium4 под Windows (XP) ? Смотрел в SoftICE MSR-регистры MSR_LASTBRANCH_* - или постоянно всё обнулено, или стабильный набор значений, Ппохоже механизм трассировки отключен т.к. бит 0 в регистре IA32_DEBUGCTL (1d9) сброшен. Попытки писать в этот регистр ничего не дают, при посл. чтении - снова 0. :-( Раньше помню под 9х SoftICE при всплытии выдавал инфу типа Last branch from IP= ..., Last branch to IP=... Теперь же такого нет, то ли из-за нового Виндовса то ли из-за SoftICE. Разъясните пожалуйста в чём тут дело. Спасибо.
эта фигня есть только на интеловских процах, amd на новых процах всю эту хрень убрала Поправлено: не на всех. вот на дюронах (у меня 1700) точно нет. на атлонах если верить Asterix-у - есть. Может у кого на дюронах есть тоже, тогда я вообще не знаю
Я вот пытался через эти регистры, но обходным путем - без драйвера(где-то в топике был линк на статью), читать значения этих регистров под Olly - результаты странные, такое ощущение что удаётся читать предыдущие значения регистров, т.е. от предыдущего дебажного исключения %) Broken Sword Точно, есть В ближайшее время собираюсь обновить его до Athlon XP, надеюсь в нем тоже будут.
Вот простенькая программка для теста поддержки MSR регистров процессором Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' include 'struct.inc' MSR_FLAG = 00000020h struct _SEH .SafeEip dd ? ; The offset where it's safe to continue execution .PrevEsp dd ? ; The previous value of esp .PrevEbp dd ? ; The previous value of ebp ends section '.code' code readable executable align 4 cproc DefaultExceptionHandler, pExcept, pFrame, pContext, pDispatch enter lea eax, [_seh] virtual at eax .sh _SEH end virtual push [.sh.SafeEip] ; здесь можно без virtual так: push [eax+_SEH.SafeEip] push [.sh.PrevEsp] push [.sh.PrevEbp] mov eax, [pContext] virtual at eax .con CONTEXT end virtual pop [.con.Ebp] pop [.con.Esp] pop [.con.Eip] ; reload context & continue execution xor eax, eax ; return ExceptionContinueExecution return endp align 4 start: mov eax, msr_msg_not_supports push eax push DefaultExceptionHandler push DWORD [fs:0] mov [fs:0], esp mov [_seh.SafeEip], SafePlace mov [_seh.PrevEbp], ebp mov [_seh.PrevEsp], esp mov [_features_edx], 0 mov eax, 1 cpuid mov [_features_edx], edx SafePlace: pop DWORD [fs:0] add esp, 4 pop eax and [_features_edx], MSR_FLAG jz @F mov eax, msr_msg_supports @@: xor ecx, ecx invoke MessageBox, ecx, eax, ecx, ecx invoke ExitProcess, 0 section '.data' data readable writeable msr_msg_supports db "The processor supports Model Specific Registers",0 msr_msg_not_supports db "The processor NOT supports Model Specific Registers",0 align 4 _seh _SEH _features_edx dd ? section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC' 1521829076__MsrRegs.rar
Asterix у меня пишет, что supports, хотя я точно знаю что нет. ты проверяешь по cpuid, а это неблагодарный метод проверки
Broken Sword У меня ранше как раз Атлон был. И SoftICE (4.2.7) на Win9x выдавал эту информацию. Только я на неё тогда внимания не обращал Сейчас WinXP SP2 SoftICE от DS 3.2 Проц Pentium4 (family 0Fh, model 02h). Для него Интел декларирует поддержку 4-х MSR регистров,сохраняющих инфу о предыдущих ветвлениях. Судя по CPUID также поддерживается Debug Store (bit 21). Т.е. можно фактически делать лог трассировки произвольного размера. По моему это вообще суперфича для исследования программ! Только вот не пашет... Я никак не пойму почему не работает запись в регистр IA32_DEBUGCTL из SoftICE: после msr -w 1d9 1 последующая msr 1d9 выдает опять 0. :-( От виндовса это вроде никак не может зависеть. Т.е. либо глюк проца, либо SoftICE.
Чем плясать с бубном, не проще ли почитать IA-32 Intel® Architecture Software Developer’s Manual, Volume3: CHAPTER 15 DEBUGGING AND PERFORMANCE MONITORING. Там всё отлично расписано.
вообще-то может, но только в 2 случаях AFAIK: 1) ring > 0 2) регистр не реализован В данном случае причин для этого нет: 1) ring0 (SoftICE) 2) этот регистр должен железно быть в Pentium4. И кроме того SoftICE вроде обрабатывает ошибки записи в MSR.
попробовал сейчас на Атлоне64 - то же самое. Т.е. SoftIce (4.3.2) инфу о посл. ветвлении не дает, изменить регистр IA32_DEBUGCTL тоже не получается (из softice). :-( infern0 пробовал: NTICE error ...
Asterix незнаю, cpuid просто копирует готовые данные, ничего при этом не проверяя. Самый верный способ в данном случае - выполнить пару переходов и прочитать значения регистров этих.