Domanda

Ho aggiunto del codice che viene compilato in modo pulito e ho appena ricevuto questo errore di Windows:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

Sto per andare a caccia di bug e mi aspetto che sia qualcosa di stupido che ho fatto e che, guarda caso, produce questo messaggio.Il codice viene compilato in modo pulito senza errori o avvisi.La dimensione del file EXE è cresciuta fino a 1.454.132 byte e include collegamenti a ODCS.lib, ma per il resto è C puro per l'API Win32, con DEBUG attivato (in esecuzione su P4 su Windows 2000).

È stato utile?

Soluzione

Per rispondere alla domanda, un'istruzione privilegiata è un codice operativo del processore (istruzione assembler) che può essere eseguito solo in modalità "supervisore" (o Ring-0).Questi tipi di istruzioni tendono ad essere utilizzati per accedere ai dispositivi I/O e alle strutture dati protette dal kernel di Windows.

I programmi regolari vengono eseguiti in "modalità utente" (Ring-3) che non consente l'accesso diretto ai dispositivi I/O, ecc...

Come altri hanno già detto, la causa è probabilmente uno stack danneggiato o una chiamata del puntatore a funzione incasinata.

Altri suggerimenti

Questo genere di cose accade solitamente quando si utilizzano puntatori a funzioni che puntano a dati non validi.Può succedere anche se hai del codice che distrugge lo stack dei resi.A volte può essere piuttosto complicato rintracciare questo tipo di bug perché di solito sono difficili da riprodurre.

Un'istruzione privilegiata è un'istruzione IA-32 che può essere eseguita solo in Ring-0 (cioèmodalità kernel).Se stai riscontrando questo problema nello spazio utente, hai un EXE molto vecchio o un file binario corrotto.

La prima probabilità che mi viene in mente è che potresti utilizzare un array locale ed è vicino alla parte superiore della dichiarazione della funzione.Il tuo controllo dei limiti è impazzito e sovrascrive l'indirizzo di ritorno e indica alcune istruzioni che solo il kernel può eseguire.

Come sospettavo, ho fatto qualcosa di stupido.Penso di aver risolto il problema due volte più velocemente a causa di alcuni indizi nei commenti nei messaggi sopra.Grazie a coloro, soprattutto a coloro che hanno segnalato qualcosa all'inizio dell'app sovrascrivendo lo stack.In realtà ho trovato diverse risposte qui più utili del post che ho contrassegnato come risposta alla domanda mentre mi indicavano e mi mettevano in coda su dove cercare, anche se penso che riassuma meglio la risposta.

Come si è scoperto, avevo appena aggiunto un pulsante che superava la dimensione massima di un array contenente alcune informazioni sui pulsanti della barra degli strumenti (che era nello stack).L'avevo dimenticato

#define MAX_NUM_TOOBAR_BUTTONS  (24)

addirittura esisteva!

La posizione dell'errore 0x00486752 mi sembra davvero piccola, prima di dove solitamente risiede il codice eseguibile.Sono d'accordo con Daniel, mi sembra un suggerimento selvaggio.

L'ho visto con Visual c++ 6.0 nel 2000.

La libreria C++ di debug conteneva chiamate a istruzioni di I/O fisiche, in un gestore di eccezioni.Se ricordo bene, stava scaricando lo stato su una porta I/O che era per i registri di base DMA, che presumo qualcuno in Microsoft stesse utilizzando per una scheda debugger.

Cercare alcune condizioni di errore che potrebbero essere latenti causando l'esecuzione del codice diagnostico.

Stavo eseguendo il debug, sono tornato sui miei passi e ho letto il disassemblaggio.È stata un'eccezione durante l'elaborazione std::string, magari indicizzando la fine.

La CPU della maggior parte dei processori prodotti negli ultimi 15 anni dispone di alcune istruzioni speciali molto potenti.Queste istruzioni privilegiate vengono conservate per le applicazioni del kernel del sistema operativo e non possono essere utilizzate dai programmi scritti dall'utente.

Ciò limita il danno che un programma scritto dall'utente può infliggere al sistema e riduce il numero di volte in cui il sistema si blocca effettivamente.

Durante l'esecuzione in modalità kernel, il sistema operativo ha accesso illimitato sia al kernel che alla memoria del programma utente.

Le istruzioni di caricamento per i registri base e limite sono istruzioni privilegiate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top