Borland C++ вылетает без сообщения
Я не уверен, что кто-то использует Borland C++ 3.1, но я должен это сделать.
У меня есть программа, которая реализует простые потоки и изменяет контекст этих потоков с помощью прерывания по таймеру.
У меня есть бесконечный цикл и 2 потока, которые выполняют свою работу и переключаются между собой и основным потоком. Их работа состоит в том, чтобы произвести вывод, написать что-то на консоли. Проблема в том, что каждый раз, когда я запускаю программу, происходит что-то другое.
Иногда это работает на полминуты и просто перестает писать то, что должно. Запись просто останавливается, ошибки нет, и borland не падает. Иногда это останавливается, и Borland падает без сообщения. Иногда он останавливается, и Borland вылетает с сообщением "недопустимая инструкция". Иногда в последней строке записывается перед остановкой некоторые странные символы, которые не должны отображаться.
Это консоль, которая "полна" и Borland действует странно? В чем может быть проблема?
2 ответа
Если я правильно помню, это было небезопасно для записи на консоль (или использовать файловый ввод / вывод) под DOS при вызове из прерывания. Чтобы сделать это правильно, вы должны проверить что-то под названием "Флаг повторного входа DOS" и записывать в консоль только в том случае, если оно равно нулю (см. http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH18/CH18-3.html или поиск в Интернете для получения дополнительной информации)
В реальном и виртуальном режимах 8086 программы не защищены друг от друга. Итак, если ваша программа что-то испортила, например:
- перезаписывает память, которая не принадлежит ему (или соответствующему потоку сама по себе), включая повреждения памяти из-за переполнения стека в программе или ее ISR
- не в состоянии сохранить (= сохранить, затем восстановить) регистры процессора в любом из его ISR
- меняет состояние оборудования на что-то неожиданное для остальной системы
- изменяет частоту таймера очевидным для остальных системных способов
если он делает что-то из этого, не должно быть сюрпризом, что что-то падает, зависает или плохо себя ведет каким-либо другим способом.
Я предполагаю, что у вас есть проблемы 1 и / или 2 выше. Вы также можете участвовать в гонке.
К сожалению, не видя ни одного вашего кода, мы не можем больше помочь. Подумайте об этом, это все равно что лечить нового пациента по телефону.