Mémoire ne peut pas être "Read" ==> causes possibles ?
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
12 nov. 2006 à 19:53
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
20 nov. 2006 à 20:49
Violent Ken
Bonjour, j'ai compilé mon application, et j'obtiens le célèbre bug "l'instruction à "0x00000000" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être "read""
Ce bug arrive toujours au même endroit, après une certaine suite d'actions dans mon programme.
Quelles peut être la cause de ce bug ?
Comment puis-je debuger mon programme ?
Je vous demande pas de le debuger, juste me dire le causes principales de ce genre de truc ;)
Merci, @+
A voir également:
Mémoire ne peut pas être "Read" ==> causes possibles ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 12 nov. 2006 à 20:16
Tout dépend ! Tu utilise des API Windows par exemple ?
Normalement, ce genre d'erreur intervient lorsque tu dépasse la zone mémoire de ton prog : chose courante avec les pointeurs C par exemple, d'où ma question sur les API.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 nov. 2006 à 20:29
Bug, certain, il y a.
Par contre ce message (et son corolaire "la mémoire ne peut pas etre write") ne donne absolument aucune indication quant à la nature du bug (en VB en tout cas). Contrairement à ce qu'il indique ça peut très bien ne rien à voir avec une lecture au niveau de ton code.
Mais une chose interessante tout de même, tu dis : "Ce bug arrive toujours au même endroit, après une certaine suite d'actions dans mon programme.". Tu devrais donc etre capable assez facilement d'isoler la partie de code qui pose problème.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 12 nov. 2006 à 20:39
Violent Ken
En fait non, je me demande bien comment je pourrais isoler un bout de code
Je vais détailler un peu plus comment apparait le bug.
Mon programme est un éditeur hexadécimal (application MDI).
Quand j'ouvre un disque dur en édition hexa, tout marche bien.
Quand j'édite un processus en mémoire, tout marche bien.
Quand j'édite un fichier, tout marche bien.
Mais quand j'ouvre un disque dur en édition PUIS que j'essaie d'ouvrir un processus en mémoire, le bug survient.
Mais si , par exemple, j'ouvre un disque, PUIS j'ouvre un fichier, PUIS un processus, pas de bug.
Si j'ouvre un fichier, PUIS un disque, pas de bug.
Si j'ouvre un fichier, PUIS un processus, pas de bug.
Le bug intervient uniquement quand j'ouvre un disque, PUIS un processus. Une petite form doit apparait avec la liste des processus lancés, mais celle ci n'apparait pas, le bug a lieu à cet endroit là (ou avant).
Donc comme il y a un lien avec les actions faites avant, je vois pas d'où çà peut venir...
Et comme pas de bug en P-CODE (dans l'IDE par exemple), impossible de débuger avec des points d'arrêt....
Je suis peaumé !
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 nov. 2006 à 20:45
Bien sur que si, tu peux isoler le bout de code, tu viens de le faire, je te cite : "Une petite form doit apparait avec la liste des processus lancés, mais
celle ci n'apparait pas, le bug a lieu à cet endroit là (ou avant)."
Et il a toujours moyen de débuger, même en Release. Mots clés : MsgBox, Beep, fichier log, .....
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 12 nov. 2006 à 21:14
lol, c'est pas faux ;)
première chose : regarde dans le initialize de la classe clsProcess tout les appels à des API qui pourraient avoir de près ou de loin à des accès mémoire...
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 12 nov. 2006 à 21:17
Violent Ken
Certes. Mais je me vois mal poster mes 20 mille lignes de code...
Je postais juste ces 3 lignes de code pour dire que le bug provient plus ou moins aléatoirement dans la même portion du code, c'est tout.
Voici la sub complète du loading de la form en question :
Private Sub Form_Load()
'fait la liste des processus en mémoire
Dim p() As ProcessItem
Dim x As Long
Dim clsProc As clsProcess 'appel à une classe de gestion de processus
Set clsProc = New clsProcess
LV.ListItems.Clear
'énumération
clsProc.EnumerateProcesses p()
'affiche la liste
For x = 0 To UBound(p) - 1
LV.ListItems.Add Text:=p(x).th32ProcessID
LV.ListItems.Item(x + 1).SubItems(1) = p(x).szExeFile
Next x
End Sub
Dans le Initialize de ma classe, il y a du
-OpenProcessToken
-LookupPrivilegeValue
-AdjustTokenPrivileges
dthuler
Messages postés121Date d'inscriptiondimanche 9 mars 2003StatutMembreDernière intervention29 avril 2009 12 nov. 2006 à 21:30
Salut,
Pardon de poser une question peut-être naïve, mais ton code ne rentre-t-il pas en conflit direct avec les process qui gèrent des accès disques ? Il est possible que certains process système bloquent des portions de mémoires si besoin.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 12 nov. 2006 à 21:40
Ah ca a quand même un rapport : OpenProcessTocken ouvre un accès à un processus => c'est le genre de cas où tu va piocher dans la mémoire d'un autre processus que ton programme ! le SP2 de windows XP risque fort de ne pas apprécier justement ! Et ca risque d'être pire avec vista !
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 12 nov. 2006 à 21:56
Violent Ken
dthuler ==> je ne vois pas trop où il pourrait y avoir de confilt ? Certaines zones mémoires sont en effet inaccessibles, mais ce n'est pas un problème, si ?
DARKSIDIOUS ==> Oui, je pioche dans la mémoire d'un autre process, tout comme avec OpenProcess, ReadProcessMemory, VirtualQueryEx... Mais quel est le problème ? Ces APIs sont conçues pour, non ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 nov. 2006 à 22:00
"je ne vois pas trop où il pourrait y avoir de confilt ? Certaines zones
mémoires sont en effet inaccessibles, mais ce n'est pas un problème,
si ?"
Ben si, si tu essaye d'y taper dedant t'as un message d'erreur
"Oui, je pioche dans la mémoire d'un autre process, tout comme avec
OpenProcess, ReadProcessMemory, VirtualQueryEx... Mais quel est le
problème ? Ces APIs sont conçues pour, non ?"
Non tant que tu as les droits administratifs pour.
Mais si tu tape dans la zone mémoire d'un driver et du kernel, je doute que windows te laisse faire.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 12 nov. 2006 à 22:06
Ces API ont prévues pour, c'est vrai, mais depuis le SP1, et ca c'est vraiment mis en place avec le SP2 de Windows XP, microsoft a renforcé la sécurité du noyau, et du coup, certaines chose qui étaient possible avant ne le sont plus, ou très difficilement afin d'éviter des dérices, nottament l'accès à des zones mémoires qui ne sont pas allouées par le processus appelant.
Je m'y connais pas assez pour m'éttaler plus sur la question, mais il y a des chances que cela vienne de là !
En passant, un bon petit article à ce sujet qui devrait t'intéresser :
http://mi.cnrs-orleans.fr/News/WinXP/Windows-XP-Service-Pack-2-FR.pdf
dthuler
Messages postés121Date d'inscriptiondimanche 9 mars 2003StatutMembreDernière intervention29 avril 2009 12 nov. 2006 à 22:33
Si, ça le peut malheureusement... mais ça m'étonnerait beaucoup d'après les détails donnés.
L'explication "Windows" est que ton code tente d'accéder à une partie de la mémoire non réservée/authorisée par le système si cet accès n'a pas été "demandé" préalablement. En clair, si un pointeur n'a pas été initialisé correctement dans une des APIs appelées, le code est dans les choux. As-tu essayé d'attribuer les droits "system" ou "admin" à ton appli ?
Mais je pencherais plutôt à un conflit style handle non libéré ou déjà utilisé... ou alors la pioche dans une zone réservée exclusivement...
Désolé mais là, je navigue à la frontière de mes connaissances VB, et ne peux donc te fournir que quelques (minces) pistes. Toutefois, étant de nature curieuse, la solution si tu la trouves m'intéresse vivement.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 nov. 2006 à 22:41
Non david dans le message, il est précisé "adresse 0x00000000". ici il s'agit bien d'un pointeur null ou pas initialisé, utilisation d'un objet non encore créé ou instancié ou déjà libéré, ....
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #