Heisenbug: программа WinApi отказывает на некоторых компьютерах

Когда вы добавляете set -x к своему коду, вы получаете больше информации:

+ [[ origin/HEAD -> origin/master =~ \*origin\\/HEAD\* ]]
+ [[ origin/HEAD -> origin/master =~ .*origin/HEAD.* ]]
+ echo OK
OK
+ reg='.*origin\/HEAD.*'
+ [[ origin/HEAD -> origin/master =~ .*origin\/HEAD.* ]]

Специальные символы в назначении используются как обычные символы в одинарных кавычках. Вы видите дополнительные обратные слеши в первой строке, избегая расширения оболочкой.
Ваш reg= также использует одинарные кавычки. Когда вы используете $reg, подстановочные знаки снова раскрываются. Возможно, посмотрите на другой пример:

reg='ls *'
echo "reg (unquoted)="${reg}
echo "reg (quoted)  =${reg}"
9
задан 7 revs 8 October 2008 в 08:02
поделиться

11 ответов

Так это doesnnt отказывают, когда конфигурацией является Настройка отладочного процесса? Существует много вещей, отличающихся, чем конфигурация ВЫПУСКА: 1.) Инициализация globals 2.) Фактический машинный код, сгенерированный и т.д.

Таким образом, первый шаг, узнают то, что является точными настройками для каждого параметра в режиме RELEASE по сравнению с Режимом отладки.

- AD

5
ответ дан 4 December 2019 в 07:49
поделиться

Большая часть heisenbugs / ошибки только для выпуска происходят или из-за потока управления, которое зависит от чтений от неинициализированной памяти / устаревшие указатели / прошлый конец буферов, или условия состязания или оба.

Попытайтесь переопределить свои средства выделения, таким образом, они обнуляют память при выделении. Проблема уходит (или стать более восстанавливаемой?)

Writig журнал показывает, что катастрофический отказ происходит на объявлении локальной международной переменной! Как это могло быть? Повреждение памяти?

Переполнение стека!;)

1
ответ дан 4 December 2019 в 07:49
поделиться

Загрузите Средства отладки для пакета Windows. Установите пути символа правильно, затем запустите Ваше приложение под WinDbg. В какой-то момент это порвет с Нарушением прав доступа. Затем необходимо выполнить команду"! проанализируйте-v", который довольно умен и должен дать Вам подсказку на том, что идет не так, как надо.

2
ответ дан 4 December 2019 в 07:49
поделиться

1) Катастрофический отказ происходит только в Версии выпуска.

Это обычно - знак, что Вы полагаетесь на некоторое поведение, которое это не гарантируется, но, оказывается, верно в отладочной сборке. Например, если Вы забываете инициализировать свои переменные или получать доступ к массиву за пределы. Удостоверьтесь, что Вы включили все проверки компилятора (/RTCsuc). Также проверьте вещи как доверие порядку оценки параметров функции (который не гарантируется).

2) Катастрофический отказ уходит, как только я удаляю весь связанный с GDI материал.

Возможно, это - подсказка, что Вы делаете что-то не так со связанным с GDI материалом? Вы используете ДЕСКРИПТОРЫ после того, как они были освобождены, например?

4
ответ дан 4 December 2019 в 07:49
поделиться

4) Writig журнал показывает, что катастрофический отказ происходит на объявлении локальной международной переменной! как это могло быть? Повреждение памяти?

Каков базовый код в исполняемом файле / блок? Объявление интервала не является никаким кодом вообще, и как таковой не может отказать. Вы инициализируете интервал так или иначе?

Для наблюдения кода, где катастрофический отказ произошел, необходимо выполнить то, что называют посмертным анализом.

Windows Error Reporting

Если Вы хотите проанализировать катастрофический отказ, необходимо получить дамп катастрофического отказа. Одна опция для этого состоит в том, чтобы зарегистрироваться для Windows Error Reporting - требует небольшого количества денег (Вам нужен цифровой идентификатор подписывания кода), и некоторое заполнение формы. Для большего количества посещения https://winqual.microsoft.com/.

Получите дамп катастрофического отказа, предназначенный для WER непосредственно от клиента

Другая опция состоит в том, чтобы выйти на связь, околдовывают некоторого пользователя, который испытывает катастрофический отказ, и получите дамп катастрофического отказа, предназначенный для WER от него непосредственно. Пользователь может сделать это, когда он нажимает на Технические детали прежде, чем отправить катастрофический отказ Microsoft - расположение файла дампа катастрофического отказа может быть проверено там.

Ваш собственный мини-дамп

Другая опция состоит в том, чтобы зарегистрировать Ваш собственный обработчик исключений, обработать исключение и записать мини-дамп где угодно, Вы желаете. Подробное описание может быть найдено при Вскрытии Проекта Кода, Отлаживающем Ваше Приложение со статью Visual Studio.NET и Мини-дампами.

10
ответ дан 4 December 2019 в 07:49
поделиться

4) Writig журнал показывает, что катастрофический отказ происходит на объявлении локальной международной переменной! как это могло быть? Повреждение памяти

Я нашел, что причина к многочисленным "странным катастрофическим отказам" разыменовывает поврежденного this в функции членства упомянутого объекта.

1
ответ дан 4 December 2019 в 07:49
поделиться

Что говорит катастрофический отказ? Нарушение прав доступа? Исключение? Это было бы дальнейшей подсказкой для решения этого с

Удостоверьтесь, чтобы у Вас не было предыдущих повреждений памяти с помощью PageHeap.exe

Удостоверьтесь, чтобы у Вас не было переполнения стека (массив CBig [1000000])

Удостоверьтесь, чтобы у Вас не было неинициализированной памяти.

Далее можно выполнить версию выпуска также в отладчике, после того как Вы генерируете отладочные символы (не то же как создающий отладочную версию) для процесса. Шаг через и видит, получаете ли Вы какие-либо предупреждения в окне трассировки отладчика.

1
ответ дан 4 December 2019 в 07:49
поделиться

"4) Запись журнала показывает, что катастрофический отказ происходит на объявлении локальной международной переменной! Как это могло быть? Повреждение памяти?"

Это могло быть знаком, что оборудование на самом деле неисправно или борется также. Узнайте, разогнали ли они свой компьютер.

1
ответ дан 4 December 2019 в 07:49
поделиться

Когда я получаю этот тип вещи, я пытаюсь выполнить код через gimpels Линт ПК (статический анализ кода), поскольку это проверяет различные классы ошибок к BoundsChecker. Если Вы используете Boundschecker, включаете опции отравления памятью.

Вы упоминаете центральные процессоры AMD. Вы занялись расследованиями, существует ли подобная видеокарта / версия драйвера и / или конфигурация на месте на машинах тот катастрофический отказ? Это всегда отказывает на этих машинах или просто иногда? Возможно, выполните инструмент System Information на этих машинах и посмотрите то, что они имеют общего,

1
ответ дан 4 December 2019 в 07:49
поделиться

Попробуйте Рациональный (IBM) PurifyPlus. Это фиксирует много ошибок, которые не делает BoundsChecker.

1
ответ дан 4 December 2019 в 07:49
поделиться

Походит на повреждение стека мне. Моим любимым инструментом для разыскивания их является IDA Pro. Конечно, у Вас нет того доступа к машине пользователя.

Некоторым средствам проверки памяти нелегко ловить повреждение стека (если это действительно это). Самым верным способом получить тех, которые я думаю, является анализ во время выполнения.

Это может также произойти из-за повреждения в пути исключения, даже если исключение было обработано. Вы отлаживаете за 'включенными исключениями первого шанса выгоды? Вы должны, пока Вы можете. Это действительно становится раздражающим через некоторое время во многих случаях.

Можно ли отправить тем пользователям проверенную версию приложения? Мини-дамп выезда Обрабатывает то исключение и выписывает дамп. Затем используйте WinDbg для отладки на конце.

Другой метод пишет очень подробные журналы. Создайте опцию "Log every single action" и попросите, чтобы пользователь включил это и отправил ее также Вы. Разгрузите память в журналы. Выезд '_CrtDbgReport ()' на MSDN.

Удачи!

Править:

Ответ на Ваш комментарий: ошибка на локальном объявлении переменных не удивительна мне. Я видел это много. Это обычно происходит из-за поврежденного стека.

Некоторая переменная на стеке может работать, это - границы, например. Весь ад вырывается на свободу после этого. Затем сложите случайные ошибки памяти броска объявлений переменной, виртуальные таблицы повреждаются и т.д.

Каждый раз, когда я видел тех, которые в течение продлить промежутка времени, я должен был перейти к IDA Pro. Подробное дизассемблирование во время выполнения, отлаживающее, является единственной вещью, я знаю, что действительно получает это надежно.

Многие разработчики используют WinDbg для этого вида анализа. Вот почему я также предложил Мини-дамп.

1
ответ дан 4 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: