c сообщение об ошибке во время выполнения - PullRequest
0 голосов
/ 06 декабря 2009

эта ошибка появилась при создании файла с использованием fopen на языке программирования c

ЦП NTVDM обнаружил недопустимую инструкцию CS: 0000 IP0075 OP: f0 00 f0 37 05 выбирает 'close для завершения операции

Ответы [ 3 ]

2 голосов
/ 06 декабря 2009

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

В этом случае я бы предположил, что «IP0075» является указателем инструкций, и что выполненные недопустимые инструкции были по адресу 0x0075. Держу пари, что этот адрес НЕ привязан к исполняемому коду приложения.

ОБНОВЛЕНИЕ на возможном соединении с 'fopen': OP заявляет, что удаление кода fopen устраняет проблему. К сожалению, это не доказывает, что код fopen является причиной проблемы. Например:

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

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

Проблема почти наверняка в том, что ваше приложение сделало что-то с "неопределенным поведением" в соответствии со стандартом C. Может случиться что угодно, и есть вероятность, что это не будет иметь никакого смысла.

Отладка такого рода проблем может быть очень сложной. Вам, вероятно, следует начать с запуска «lint» или аналога над вашим кодом и исправления всех предупреждений. Далее, вам, вероятно, следует использовать хороший отладчик и пошаговое приложение, чтобы попытаться найти, куда оно переходит к неверному коду / адресу. Затем вернитесь, чтобы выяснить, что послужило причиной этого.

0 голосов
/ 06 декабря 2009

Хммм .... вы упомянули NTVDM, который звучит как старое 16-битное приложение, которое каким-то образом зависало в старом командном окне с установленной совместимостью приложений. Поскольку никакой код не был опубликован, можно было бы предположить, что это как-то связано с файлами (но fopen - как вы узнаете об этом, не показывая подсказки?) Возможно, был какой-то конкретный файл, который дольше, чем обычное 8.3 соглашение с именами DOS-файлов, и оно перестало работать при попытке прочитать его или что 16-битное приложение выполняется внутри папки, которая снова имеет имя более 8,3?

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 06 декабря 2009

Предполагая, что действительно вызов fopen () вызывает проблемы (трудно сказать без вашего исходного кода), вы проверили, что 2-символьные указатели, которые вы передаете функции, на самом деле являются указателями на правильно распределенную память? Может быть они не правильно инициализированы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...