Ce est un lieu privilégié pour l'enseignement?
J'ai ajouté un bout de code qui compile correctement et viens de recevoir cette erreur Windows:
---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.
(0xc0000096) occurred in the application at location 0x00486752.
Je suis sur le point d'aller sur une chasse au bug, et je m'attends à être quelque chose de stupide que j'ai faite, qui arrive juste à produire ce message. Le code se compile correctement sans erreurs ou des avertissements. La taille de l'EXE fichier a grandi à 1,454,132 octets, et contient des liens vers ODCS.lib
, mais il en est autrement de la pure C de l'API Win32, avec le niveau de DEBUG (en cours d'exécution sur un P4 sur Windows 2000).
Vous devez vous connecter pour publier un commentaire.
Pour répondre à la question, un lieu privilégié d'instruction est un processeur op-code (instruction assembleur) qui ne peuvent être exécutées que "superviseur" (ou Ring 0) mode.
Ces types d'instructions ont tendance à être utilisé pour accéder à des périphériques d'e/S et protégé des structures de données du noyau de windows.
Programmes réguliers exécuter en "mode utilisateur" (Ring-3) qui n'autorise pas l'accès direct aux périphériques d'e/S, etc...
Comme d'autres l'ont mentionné, la cause est probablement une corruption de la pile ou d'une foiré pointeur de fonction d'appel.
Ce genre de chose se produit généralement lors de l'utilisation de la fonction de pointeurs qui pointent sur des données non valides.
Il peut également se produire si vous avez le code que trashes votre retour de la pile. Il peut parfois être assez difficile à suivre ce genre de bugs bas parce qu'ils sont généralement difficiles à reproduire.
Privilégié d'instruction est un IA-32 instruction qui ne peut être exécuté dans le Ring-0 (c'est à dire en mode noyau). Si vous êtes à frapper ce dans l'espace utilisateur, vous avez eu une très ancien EXE, ou la corruption d'un fichier binaire.
Première probabilité que je peux penser à est de, vous avez peut-être l'aide d'une matrice et il est près du haut de la déclaration de la fonction. Votre vérification des limites fou et d'écraser l'adresse de retour et des points à certaines instructions que seul le noyau est autorisé à exécuter.
Comme je m'en doutais que c'était quelque chose de stupide que j'ai fait. Je pense que j'ai résolu ce problème deux fois plus vite à cause de certains de ces indices dans les commentaires dans les messages ci-dessus. Merci à ceux en particulier ceux qui ont fait quelque chose de début de l'application de l'écrasement de la pile. J'ai effectivement trouvé plusieurs réponses ici plus utile que le post que j'ai marqué comme réponse à la question qu'ils informés et mis en file d'attente moi où chercher, mais je pense que ça résume bien la réponse.
Comme il s'est avéré que j'avais juste ajouté un bouton qui est allé sur la taille maximale d'un tableau contenant de l'outil bouton de la barre d'informations (qui était sur la pile). J'avais oublié que
même l'existence!
L'emplacement de l'erreur 0x00486752 semble vraiment petit pour moi, avant d'où le code de l'exécutable vit habituellement. Je suis d'accord avec Daniel, il semble comme un sauvage pointeur vers moi.
J'ai vu cela avec Visual c++ 6.0 en l'an 2000.
Le débogage de la bibliothèque C++ a des appels d'e/S physiques des instructions qui, dans un gestionnaire d'exception.
Si je me souviens bien, c'était le dumping état à un port d'e/S utilisé pour être le DMA de la base de registres, je suppose que quelqu'un de chez Microsoft a été l'aide d'un débogueur carte.
Chercher une condition d'erreur qui peut être latente causant des diagnostics de code à exécuter.
J'ai été le débogage, fait marche arrière et lire la dissassembly. C'était une exception lors du traitement
std::string
, peut-être que l'indexation de la fin.Le CPU de la plupart des processeurs fabriqués dans les 15 dernières années ont quelques instructions qui sont très puissants. Ces privilégiés instructions sont conservés pour le système d'exploitation noyau applications et ne sont pas en mesure d'être utilisé par l'utilisateur écrit des programmes.
Cela limite les dégâts qu'un écrit par l'utilisateur du programme peut infliger sur le système et permet de réduire le nombre de fois que le système se bloque.
Lors de l'exécution en mode noyau, le système d'exploitation dispose d'un accès illimité à la fois le noyau et le programme utilisateur de la mémoire.
Les instructions de chargement de la base et la limite de registres sont privilégiés instructions.