Я занимаюсь разработкой поставщика учетных данных нашей компании для Windows 10 почти год.
Теперь я столкнулся с проблемой. Обычно я не задаю вопросы на форумах, в блогах, потому что в большинстве случаев я нахожу решение, но на этот раз я боролся с проблемой в течение месяца и нашел корень проблемы.
Краткое описание самой проблемы: провайдер учетных данных использует поле со списком, которое раньше работало без проблем. Теперь я переписал весь код, чтобы управлять большим обновлением, но в систему попала странная ошибка. Ошибка возникает только в определенном сценарии. Я разрабатываю и тестирую код на своем личном ноутбуке.
Сценарий:
1) Ноутбук подключен к моему монитору / источнику питания и т. Д.
2) Я засыпаю.
3) Отключаю все кабели (в том числе силовые).
4) Просыпаюсь ото сна.
Затем в поле со списком не отображается элемент, выбранный по умолчанию, он пуст. Когда я его раскрываю, отображаются все необходимые элементы. После того, как credprov вылетает и перезагружается, все в порядке.
Я знаю, что в подобных «странных» сценариях в большинстве случаев проблема возникает из-за утечки памяти или чего-то еще. Когда я проверяю средство просмотра событий, он показывает мне c0000005, что является нарушением доступа. Я начал отлаживать, где нарушение. Затем я обнаружил, что программа ссылается на массив списка элементов combobox (на самом деле вектор в моем случае) с очень высоким индексом (причина нарушения может быть вне диапазона). Фактический индекс, очевидно, хранится в переменной «selectedComboItemIndex» (DWORD).
Мне было любопытно, когда он изменился на это странное число, чем я обнаружил неожиданное поведение. Метод SetComboBoxSelectedValue случайным образом вызывается один раз (при возникновении ошибки) с безумно высоким значением индекса. Я даже не вызываю этот метод в своем коде, поэтому понятия не имею, почему он вызывается. Вызов происходит даже тогда, когда я не выпадаю из поля со списком.
Я даю ему шанс, что это может быть ошибка в самом credprov. Что вы думаете? Вы видели эту проблему раньше?
Заранее спасибо!