Как продолжить отладку после перерыва в Windbg Preview? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть следующий пример кода:

#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 с последующим списком сложных команд.

Каждый советбудет оценено, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...