На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Ошибка выполнения: <Privileged instruction> , Куды рыть?
    При запуске приложения вылетает окошко критического сообщения с с текстом "Privileged instruction" :wall: :wall: :wall: .
    После чего программа продолжает свою роботу.

    Пока даже не знаю, с какой стороны к этой ошибке подступится и куды вообще рыть? Какую "опасную" инструкцию искать?
      В IDE под отладчиком проверь.
        прошёлся отладчиком по шагам, выяснил, что вылетает при работе следёющего кода:
        ExpandedWrap disabled
          void TStab::LoadIni(TIniFile *f, AnsiString sectName)
          {
            vyb   = f->ReadInteger(sectName,   "vyb", 10);  // Размеры выборок
            vybMS = f->ReadInteger(sectName, "vybMS", 10);
           
            // Количества учавствующих в расчёте тэгов
            qAn    = f->ReadInteger(sectName,   "qAn", 1); // Количество аналоговых входов
            qAnMS  = f->ReadInteger(sectName, "qAnMS", 1); // Количество аналоговых входов по МС
            qDig   = f->ReadInteger(sectName,  "qDig", 1); // Количество дискретных входов
            qDigMS = f->ReadInteger(sectName,"qDigMS", 0); // Количество дискретных входов по МС
            qSt    = f->ReadInteger(sectName,   "qSt", 1); // Количество стартовых условий
           
            AnsiString s = f->ReadString(sectName, "anCom0", "Параметр 1" ); // Вылетает после выполнения этой строки
          }

        при этом - строки с <f->ReadInteger> выполняются без ошибок, и, более того, сами значения считываются правильно.

        Насколько понимаю - причина не в строке с <f->ReadString(...)>, а где-то раньше портится память - вопрос в том - как отловить место порчи. И что конкретно означает <Privileged instruction> ?
          Privileged instruction означает, что в программе была попытка, вызвать недопустимую в данный момент инструкцию (например асм-команду, из ринг3, которая может выполнится только в ринг0; sysexit, как вариант).
            В данном случае это значит немного другое, скорее всего. Привелигированая инструкция появилась после того, как в память, которая будет выполняться записался мусор/частично затер нормальные инструкции, и так уж совпало, что получилась привелигированая.

            Цитата
            AnsiString s = f->ReadString(sectName, "anCom0", "Параметр 1" );

            Какой третий параметр у ReadString()? Везде у тебя числа 1,0,10 а тут вдруг ANSI-строка, ещё и русскими символами. Я не шарю в стандартных классах и их методах, не знаю твой это ReadString() или готовый уже, но в любом случае диззасемблируй его.
              Цитата FFF1 @
              Какой третий параметр у ReadString()
              - это значение - возвращаемое по умолчанию (в случае, если считывание из ini-файла не удалось). А функция - стандартная Borland-овская - это метод класса TIniFile для считывания строковых параметров.

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

              Добавлено



              А ларчик просто открывался, сразу надо было CodeGuard-ом пройтись. Ещё до считывания файла срабатывало событие OnDrawCell, а внутри него шло обращение к ещё не созданому объекту. вот память и портилась. Всем спасибо за подсказки и разьяснения.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,7764 ]   [ 16 queries used ]   [ Generated: 11.08.25, 21:40 GMT ]