
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.37] |
![]() |
|
Сообщ.
#1
,
|
|
|
При запуске приложения вылетает окошко критического сообщения с с текстом "Privileged instruction"
![]() ![]() ![]() После чего программа продолжает свою роботу. Пока даже не знаю, с какой стороны к этой ошибке подступится и куды вообще рыть? Какую "опасную" инструкцию искать? |
Сообщ.
#2
,
|
|
|
В IDE под отладчиком проверь.
|
Сообщ.
#3
,
|
|
|
прошёлся отладчиком по шагам, выяснил, что вылетает при работе следёющего кода:
![]() ![]() 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> ? |
Сообщ.
#4
,
|
|
|
Privileged instruction означает, что в программе была попытка, вызвать недопустимую в данный момент инструкцию (например асм-команду, из ринг3, которая может выполнится только в ринг0; sysexit, как вариант).
|
Сообщ.
#5
,
|
|
|
В данном случае это значит немного другое, скорее всего. Привелигированая инструкция появилась после того, как в память, которая будет выполняться записался мусор/частично затер нормальные инструкции, и так уж совпало, что получилась привелигированая.
Цитата AnsiString s = f->ReadString(sectName, "anCom0", "Параметр 1" ); Какой третий параметр у ReadString()? Везде у тебя числа 1,0,10 а тут вдруг ANSI-строка, ещё и русскими символами. Я не шарю в стандартных классах и их методах, не знаю твой это ReadString() или готовый уже, но в любом случае диззасемблируй его. |
Сообщ.
#6
,
|
|
|
Цитата FFF1 @ - это значение - возвращаемое по умолчанию (в случае, если считывание из ini-файла не удалось). А функция - стандартная Borland-овская - это метод класса TIniFile для считывания строковых параметров.Какой третий параметр у ReadString() В общем - понятно, надо искать порчу памяти в другом месте. сама по себе эта функция вряд ли сможет создать привелигированную инструкцию. Добавлено А ларчик просто открывался, сразу надо было CodeGuard-ом пройтись. Ещё до считывания файла срабатывало событие OnDrawCell, а внутри него шло обращение к ещё не созданому объекту. вот память и портилась. Всем спасибо за подсказки и разьяснения. |