Mémoire ne peut pas être "Read" ==> causes possibles ?

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 12 nov. 2006 à 19:53
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 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, @+

60 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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.
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
12 nov. 2006 à 20:27
Violent Ken

Euh, oui, j'utilise beaucoup d'APIs (98 différentes).
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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é !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
12 nov. 2006 à 20:41
dans ces API, y'en a-t-il qui on trait à la mémoire (copymemory, zerofill, ou autre) ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
12 nov. 2006 à 20:46
Violent Ken

Il y a notamment du MoveMemory et du SetFilePointerEx.

Mais vu l'utilisation du MoveMemory par rapport à l'apparition du bug, je doute très fortement qu'il soit en cause.
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
12 nov. 2006 à 20:51
Violent Ken

En effet.

J'ai mis des Msgbox entre chaque ligne, et résultat ==> le bug apparait à divers endroit.

Une fois sur Set clsProc = New clsProcess
Une fois sur le frmProcesses.Show VbModal
Une fois sur le For x = 0 To UBound(p) - 1

Erf...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 nov. 2006 à 20:55
Violent ken, tu es un habitué du forum, tu connais aussi le reglèment. Tu n'es donc pas sans savoir qu'avec si peu de code, on ne peut rien faire.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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...
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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

Donc rien qui accède directement à la mémoire ?
0
dthuler Messages postés 121 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 29 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.

David
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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 !
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 nov. 2006 à 21:42
N'aurais-tu pas un problème dans la déclaration de la structure ProcessItem entre ton programme et la classe ???

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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 ?

casy ==> Je ne pense pas qu'il y ai de problème dans la déclaration de ProcessItem... mais je peux me tromper, je ne code généralement pas trop en classes.
La source de cette classe est ici : http://www.vbfrance.com/codes/CLASSE-SUR-PROCESSUS-LEURS-MODLES-PERMET-AVOIR-INFOS_40274.aspx , je n'ai pas remarqué de bug particulier à ce niveau là.

Merci beaucoup de m'aider.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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
0
dthuler Messages postés 121 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 29 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.

Bon courage

David
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
dthuler Messages postés 121 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 29 avril 2009
12 nov. 2006 à 22:52
Ah oui Casy, c'est juste!
merci de me remettre sur les rails
David
0
Rejoignez-nous