У меня есть следующий пример кода:
#include<iostream>
#include<windows.h>
#include<float.h>
#include<tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int control_word;
unsigned int cw = _controlfp_s(&control_word, 0, 0);
cw &= ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE |
EM_DENORMAL);
_controlfp_s(&cw, 0, EM_ZERODIVIDE);
float i = -10;
long l = 100000L;
__try
{
while ((i += 2) < 10)
{
printf("%.f", l / func(i));
printf("%s", "\n");
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
switch (GetExceptionCode())
{
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
printf("%s", "Error occured: division by zero");
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
printf("%s", "Error occured: illegal instruction");
break;
default:
exit(1);
}
}
return 0;
}
Предполагается, что в этой программе выполняется исключение DIVIDE_BY_ZERO.Я применяю WinDbg Preview для просмотра исключения после выполнения некоторых основных настроек:
Путь к символу по умолчанию: SRVC: \ символы http://msdl.microsoft.com/download/symbols Путь к источнику по умолчанию: путь к локальным файлам .exe и .pdb
События и исключения: системная ошибка: разрыв Неизвестное исключение: разрыв обработан C ++ EH исключение: разрыв обработан Control-C исключение: разрыв обработан Недопустимое вмешательство: игнорировать не обрабатывается Visual C ++ исключение: игнорировать не обрабатывается
Когда я делаюотладка в Visual Studio 2019, предполагаемое исключение (DIVIDE_BY_ZERO) ловится.Тем не менее, WinDbg Preview спотыкается на ILLEGAL_INSTRUCTION, несмотря на настройку, игнорирующую это.То, что я вижу в командном окне, это результат ниже:
(de8.28dc): неизвестное исключение - код c00002b4 (первый шанс) Об исключениях первого шанса сообщается перед обработкой любых исключений.Это исключение можно ожидать и обработать.eax = 00000008 ebx = 00fd8000 ecx = 5bfaa76a edx = 6b7a4a60 esi = 010ffc1c edi = 010ffc18 eip = 0112d622 esp = 010ffc1c ebp = 010ffdfc iopl = 0 nv up ei pl n2 na2 ss = ps = ss = ps = ss = ss = nss =fs = 0053 gs = 002b efl = 00010202 ConsoleApplication3! wmain + 0x172: 0112d622 f30f5945c4 mulss xmm0, dword ptr [ebp-3Ch] ss: 002b: 010ffdc0 = 7e876abd сценарий NatVis \ \ \ Windows \ Windows \ Windows \ Windows из Windows:.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ atlmfc.natvis 'Сценарий NatVis выгружен из' C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Natis \\\\\\\\\ \\\\\\\\\\\\:Программные файлы \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ cpp_rest.natvis 'Сценарий NatVis, выгруженный из файла C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutdСкрипт NatVis выгружен из 'C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wСценарий NatVis ekyb3d8bbwe \ x86 \ Visualizers \ Windows.Data.Json.natvis 'выгружен из C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ Windows.Devices.Geolocis.viso unvisation.natиз сценария 'C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ Windows.Devices.Sensors.natvis' NatVis, выгруженного из файла 'C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.190b8_8_web8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8 до 2000\ x86 \ Visualizers \ Windows.Media.natvis 'Сценарий NatVis, выгруженный из' C: \ Program Files \ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ windows.natvis 'Сценарий NatVis, выгруженный из' C: \ Program Files\ WindowsApps \ Microsoft.WinDbg_1.1908.30002.0_neutral__8wekyb3d8bbwe \ x86 \ Visualizers \ winrt.natvis '
В окне исходного кода выделяется инструкция: case EXCEPTION_ILLEGAL_INSTRUCTION:
, то есть означаетрезультат из того же исключения.Тем не менее, я пытаюсь продолжить, не нажимая кнопку «Перейти».Поэтому у меня есть две проблемы: 1) Как продолжить отладку до тех пор, пока DIVIDE_BY_ZERO не произойдет после этого (интересно также, почему ILLEGAL_INSTRUCTION был пойман при игнорировании настроек)?2) Что такое веб-статьи, посты, учебные пособия, которые будут содержать практический пример использования WinDbg?Я искал какое-нибудь понятное руководство для начинающих через Интернет, но ничего подобного в моих результатах поиска, похоже, нет.Мне нужно вводное руководство или аналогичный предмет для студентов по системному программированию, поэтому в нем должно содержаться практическое пошаговое решение, а не краткое представление WinDbg с последующим списком сложных команд.
Каждый советбудет оценено, конечно.