Исключение местоположения записи нарушения прав доступа при отладке - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь отладить службу Windows C ++, когда выдается следующее исключение (только в режиме отладки, в действительности это исключение не выдается): «Исключение, выданное в 0x00007FF75127C410 в xxxxxxxx.exe: 0xC0000005: Место записи нарушения прав доступа 0x0000018818AF3000».

Важное замечание: код работал для меня раньше, но, возможно, некоторые изменения в рабочей области повредили его. когда это работало, я разрабатывал в VS 17, я недавно изменил IDE на VS 19. Когда возникла проблема, я попытался вернуться к VS 17, но это не сработало.

  • НИЧЕГО В КОДЕКЕ НЕ ИЗМЕНИЛОСЬ! это та же версия, что работала до
  • Я пытался вернуться к VS 17
  • Я попытался изменить конфигурацию проекта, такую ​​как «базовые проверки времени выполнения» или «Библиотека времени выполнения», потому что я не могу понять, почему DEBUG и RELEASE работают по-разному в этом сценарии

EDIT:

    USHORT          logFileHeaderVersion;
    DLLS_CHECK_MODE eDllCheckMode;
    LONGLONG        lastClientTimeZValue;
    LONGLONG        lastServerClientTimeDelta;
    wstring         computerName;
    string          macAddresses;
    BYTE*           buffer;
    DWORD           dwBytesToWrite  = 0;
    DWORD           dwBytesWritten  = 0;

    logFileHeaderVersion        = LOG_FILE_HEADER_VERSION;
    eDllCheckMode               = getConfigurationManager()->getDllsCheckMode();
    lastClientTimeZValue        = Globals::getLastClientTimeZValue();
    lastServerClientTimeDelta   = Globals::getLastServerClientTimeDelta();
    computerName                = getComputerName();
    macAddresses                = getMacAddresses();

    // Convert time delta values from ticks to milliseconds.
    lastClientTimeZValue        = lastClientTimeZValue      / MILLISECOND_IN_TICKS;
    lastServerClientTimeDelta   = lastServerClientTimeDelta / MILLISECOND_IN_TICKS;

    // Determine header size.
    dwBytesToWrite  +=  2;                                      // Header-size size.
    dwBytesToWrite  +=  2;                                      // Header version size.
    dwBytesToWrite  +=  1;                                      // Mode size.
    dwBytesToWrite  +=  8;                                      // Client time Z value size.
    dwBytesToWrite  +=  8;                                      // Server client time delta size.
    dwBytesToWrite  +=  (   (computerName.size() + 1) * 2   );  // Computer name size (+ null terminator, wide string).
    dwBytesToWrite  +=  (   macAddresses.size() + 1         );  // Mac addresses size (+ null terminator).

    // Allocate the header.
    buffer = new BYTE[dwBytesToWrite];

    // Fill the header.

    *((USHORT*)     (buffer + dwBytesWritten)) = (USHORT)   dwBytesToWrite;
    dwBytesWritten  +=  2;

    *((USHORT*)     (buffer + dwBytesWritten)) =            logFileHeaderVersion;
    dwBytesWritten += 2;

    *((BYTE*)       (buffer + dwBytesWritten)) = (BYTE)     eDllCheckMode;
    dwBytesWritten  +=  1;

    *((LONGLONG*)   (buffer + dwBytesWritten)) =            lastClientTimeZValue;
    dwBytesWritten  +=  8;

    *((LONGLONG*)   (buffer + dwBytesWritten)) =            lastServerClientTimeDelta;
    dwBytesWritten  +=  8;

    wcscpy_s(   (PWCHAR)(buffer + dwBytesWritten),  dwBytesToWrite - dwBytesWritten,    computerName.c_str());
    dwBytesWritten  +=  (   (computerName.size() + 1) * 2   );

Исключение выдается в следующей строке: я думаю, что это связано с использованием wstring. и, возможно, RELEASE, предварительно выполнив некоторую оптимизацию, которая исправит проблему в DEBUG

    wcscpy_s(   (PWCHAR)(buffer + dwBytesWritten),  dwBytesToWrite - dwBytesWritten,    computerName.c_str());
...