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 программы не защищены друг от друга. Итак, если ваша программа что-то испортила, например:

  1. перезаписывает память, которая не принадлежит ему (или соответствующему потоку сама по себе), включая повреждения памяти из-за переполнения стека в программе или ее ISR
  2. не в состоянии сохранить (= сохранить, затем восстановить) регистры процессора в любом из его ISR
  3. меняет состояние оборудования на что-то неожиданное для остальной системы
  4. изменяет частоту таймера очевидным для остальных системных способов

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

Я предполагаю, что у вас есть проблемы 1 и / или 2 выше. Вы также можете участвовать в гонке.

К сожалению, не видя ни одного вашего кода, мы не можем больше помочь. Подумайте об этом, это все равно что лечить нового пациента по телефону.

Другие вопросы по тегам