|
|
|
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Ошибка выполнения: <Privileged instruction>
, Куды рыть?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Senior Member Рейтинг (т): 23 |
При запуске приложения вылетает окошко критического сообщения с с текстом «Privileged instruction» . Пока даже не знаю, с какой стороны к этой ошибке подступится и куды вообще рыть? Какую «опасную» инструкцию искать? |
Сан Иваныч |
|
В IDE под отладчиком проверь. |
Шурик П. |
|
Senior Member Рейтинг (т): 23 |
прошёлся отладчиком по шагам, выяснил, что вылетает при работе следёющего кода:
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> ? |
7inner |
|
Privileged instruction означает, что в программе была попытка, вызвать недопустимую в данный момент инструкцию (например асм-команду, из ринг3, которая может выполнится только в ринг0; sysexit, как вариант). |
FFF1 |
|
В данном случае это значит немного другое, скорее всего. Привелигированая инструкция появилась после того, как в память, которая будет выполняться записался мусор/частично затер нормальные инструкции, и так уж совпало, что получилась привелигированая. Цитата AnsiString s = f->ReadString(sectName, «anCom0», «Параметр 1» ); Какой третий параметр у ReadString()? Везде у тебя числа 1,0,10 а тут вдруг ANSI-строка, ещё и русскими символами. Я не шарю в стандартных классах и их методах, не знаю твой это ReadString() или готовый уже, но в любом случае диззасемблируй его. |
Шурик П. |
|
Senior Member Рейтинг (т): 23 |
Цитата FFF1 @ 29.10.07, 15:17 Какой третий параметр у ReadString() — это значение — возвращаемое по умолчанию (в случае, если считывание из ini-файла не удалось). А функция — стандартная Borland-овская — это метод класса TIniFile для считывания строковых параметров. В общем — понятно, надо искать порчу памяти в другом месте. сама по себе эта функция вряд ли сможет создать привелигированную инструкцию. Добавлено 30.10.07, 06:18 А ларчик просто открывался, сразу надо было CodeGuard-ом пройтись. Ещё до считывания файла срабатывало событие OnDrawCell, а внутри него шло обращение к ещё не созданому объекту. вот память и портилась. Всем спасибо за подсказки и разьяснения. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Borland C++ Builder/Turbo C++ Explorer
- Следующая тема
[ Script execution time: 0,0312 ] [ 16 queries used ] [ Generated: 25.05.23, 08:11 GMT ]
Ллирик 0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
||||||||
1 |
||||||||
09.02.2017, 02:27. Показов 8781. Ответов 11 Метки нет (Все метки)
При попытке вызвать процедуру другой формы из другого юнита передаваемую как параметр, получаю error privileged instruction
. Вызовов ShowMessageModal достаточно много и мне бы не хотелось описывать каждую передаваемую процедуру отдельно. Подскажите, пожалуйста, в чём моя ошибка?
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,366 Записей в блоге: 19 |
|
09.02.2017, 08:57 |
2 |
предположу что и собачка выглядит лишней
0 |
0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
|
09.02.2017, 17:01 [ТС] |
3 |
предположу что Тогда компилятор выдаёт [dcc32 Error] Unit1.pas(1103): E2010 Incompatible types: ‘Defproc’ and ‘Procedure’
0 |
Заблокирован |
|
09.02.2017, 17:56 |
4 |
Код unit Unit1; ....................... procedure THeaderFooterForm.Button1Click(Sender: TObject); begin ShowMessageModal(Self, changeqwesttext, @procedure begin changeqwest; TabControl1.TabIndex := 1; end); end; Вы передаёте указатель на анонимную функцию — оттого и вылетает. Жаль, что подобное **рьмо вообще компилируется. Эмбаркадеровцам жирный МИНУС.
0 |
0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
|
09.02.2017, 19:54 [ТС] |
5 |
Вы передаёте указатель на анонимную функцию — оттого и вылетает. Жаль, что подобное **рьмо вообще компилируется. Эмбаркадеровцам жирный МИНУС. И что Вы предлагаете сделать?
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,366 Записей в блоге: 19 |
|
09.02.2017, 19:56 |
6 |
а в чем проблема?
0 |
Заблокирован |
|
09.02.2017, 21:33 |
7 |
И что Вы предлагаете сделать? Устроить деанон. Добавлено через 1 час 16 минут банальное переполнение стека.
0 |
0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
|
09.02.2017, 21:51 [ТС] |
8 |
Добавлено через 1 час 16 минут Вы это вообще о чём?))
0 |
Заблокирован |
|
09.02.2017, 22:02 |
9 |
О том, что синтаксический сахар Self используется как аргумент. Код locMessageForm := TMessageForm.Create(Self); В этом месте- неоднозначность, т.к. нельзя точно понять, подразумевается ли аргумент Self, или пространство имен Self. Это мой последний пост в этой темке, думаю, что сообщил достаточно. Я сваливаю.
0 |
Ллирик 0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
||||
09.02.2017, 22:20 [ТС] |
10 |
|||
посмотрите, как объявлен метод ShowModal и сделайте так же
FResultProc объявлена как внутренняя процедура TCommonCustomForm, а мне бы хотелось чтоб ShowMessageModal была внешней как ShowMessage, чтоб её можно было использовать и в последующий программах без лишней возни Добавлено через 14 минут
О том, что синтаксический сахар Self используется как аргумент. Естественно подразумевается аргумент Self, ведь процедура внешняя и у неё нет пространства имен
0 |
krapotkin 5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,366 Записей в блоге: 19 |
||||||||
09.02.2017, 23:04 |
11 |
|||||||
не надо использовать Self все просто. я же говорю, смотрите на ShowModal Кликните здесь для просмотра всего текста
и вызов
Добавлено через 38 секунд
0 |
0 / 0 / 1 Регистрация: 27.11.2016 Сообщений: 96 |
|
10.02.2017, 04:31 [ТС] |
12 |
не надо использовать Self Self я там использую для других целей) Добавлено через 20 минут
0 |
@avp, SetLength(...)
как раз работает с кучей.
@ололо, а вам таки обязательно передавать явно указатель на массив в процедуру? В таком виде неплохо работает:
var a : bgra1darray;
procedure bps(a:bgra1darray; l:integer);
var x:integer;
begin
for x := 1 to l do
begin
a[x].b:=77;
if x mod 10 =0 then
begin
write (a[x].b);
write(' ');
writeln(x);
end;
end;
end;
begin
setlength(a, 10001);
bps(a,10000);
readln;
end.
UPD0. Да, мне пришлось изменить определение:
bgra1darray = array of tbgra;
UPD1. Когда вы передаете массив в процедуру, разумеется он не будет скопирован. В этом легко убедиться, посмотрев соответствующий ассемблерный код:
Project1.dpr.38: bps(a,10000); //Privileged Instruction (EPrivilege), х=1480
0040B1B2 BA10270000 mov edx,$00002710
0040B1B7 A13C1E4100 mov eax,[$00411e3c]
0040B1BC E8FBDDFFFF call bps
И в самой процедуре:
Project1.dpr.19: begin
00408FBC 55 push ebp
00408FBD 8BEC mov ebp,esp
00408FBF 51 push ecx
00408FC0 53 push ebx
00408FC1 56 push esi
00408FC2 57 push edi
00408FC3 8BDA mov ebx,edx
00408FC5 8945FC mov [ebp-$04],eax
00408FC8 8B45FC mov eax,[ebp-$04]
00408FCB E89CC6FFFF call @DynArrayAddRef
Как видим, просто передается адрес динамического массива (через eax
), а потом помещается в стек (mov [ebp-$04],eax
).
Очевидно вы натыкались на эксепшен, потому что передавали в процедуру адрес динамического массива bps(@a, 10000)
, что приводило к двойному взятию указателя и вы просто влезали в чужую память в итоге.
- Remove From My Forums
-
Question
-
Hello
I am writing a sample program which relies on external dll. I am using vc2010 win32 console application which call external lib functions. Everything is compiling and linking without problems. When I run my program application (few lines with one
call to external lib) crashes and when I am debugging it with JIT i am watching privileged instruction exception on stack.I am compiling it with vc2010 and under Windows 7. What is curious this sample application runs fine under Windows XP. What is curious too — when I compile this same application on different compilator (mingw) program runs fine also under Windows 7!
Have you ever spotted such situation?I believe this could be because of some security issues but is this possible to set some options that such program compiled under vc2010 will works fine?
Thank you very much
-
Edited by
Tuesday, September 4, 2012 6:34 AM
wrong title
-
Edited by
Answers
-
«But I can’t understand why, when I move my program to Windows XP (via Windows XP mode and copy paste method) it runs fine?»
It’s not uncommon for such bugs to be influenced by external factors like the OS. Calls to OS functions may return different values, perhaps a string that happens to be bigger on Win7 and corrupts a char[] variable. Changes in the OS’s heap manager may expose
memory allocation bugs in your code. Changes in the thread scheduler may expose multithreading bugs in your code. And so on.«I believe it could be some security features of the Windows 7/Vista (I have also checked it under Vista and some security features that could be the reason of privileged instruction exception) but is there something I could do with it (maybe turn some
features off, I was trying run as administrator but without success, maybe some compilator flags), any other advices?»It’s unlikely that this has anything to do with security features introduced in Vista/Win7. A privileged instruction is an instruction that can only be run in kernel mode. No version of Windows (except 9x/ME) allows such instructions to be executed in user
mode. Correct application code will never contain such instructions, that’s why I suspect that something in your application went wrong and resulted in executing «garbage code».I don’t think you many options, try to debug it. Run it in debugger and when it breaks look at the stack trace, maybe you’ll get a hint where this happens.
-
Marked as answer by
Jesse Jiang
Monday, September 10, 2012 6:18 AM
-
Marked as answer by
Написал простенький код для отправки почты по смтп с авторизацией.Вчера вроде все нормально работало седня только только F9 нажал запустил код и раз ,выкидует эту ошибку Ошибка вылазит как раз когда отрабатывает ф-ция кодирующая в base64
void Base64_code(const char* strIn, AnsiString &strOut)
{
const static char base64ABC[] = «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/»;
strOut = «»;
const size_t len = strlen(strIn);
for(unsigned int i=0; i<len; i+=3) {
LONG l = ( ((LONG)strIn[i ])<<16 ) |
(((i+1) < len) ? (((LONG)strIn[i+1])<<8 ) : 0 ) |
(((i+2) < len) ? ( (LONG)strIn[i+2] ) : 0 );
strOut += base64ABC[(l>>18) & 0x3F];
strOut += base64ABC[(l>>12) & 0x3F];
if (i+1 < len) strOut += base64ABC[(l>> 6) & 0x3F];
if (i+2 < len) strOut += base64ABC[(l ) & 0x3F];
}
switch (len%3) {
case 1:
strOut += ‘=’;
case 2:
strOut += ‘=’;
}
}
раньше все работало нормально.Я так понимаю что скорей всего какой то мусор попадает в область памяти с инструкциями для проца.Плз помогите выявить место где повреждается память.