Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de tas avec un OCX

3 réponses
Avatar
seb
Bonjour,

J'ai un probl=E8me avec un OCX.
Celui ci permet d'instancier en RAM des images assez volumineuses via
une interface VB.

Or, apr=E8s quelques changements de r=E9solutions, les allocations me
renvoient "NULL". (bien sur , une lib=E9ration est faite avant chaque
allocation...)

Je pense que c'est li=E9 au tas , ci joint les trace du debugger MS :

(298.338): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=3D0241d498 ebx=3D02410000 ecx=3D00000002 edx=3D034ce508 esi=3D034cf000
edi=3D034ce508
eip=3D77fcca14 esp=3D0012e760 ebp=3D0012e76c iopl=3D0 nv up ei pl nz na po =
nc
cs=3D001b ss=3D0023 ds=3D0023 es=3D0023 fs=3D003b gs=3D0000 efl=3D00010206
ntdll!RtlFreeHeap+0x3d0

J'ai beau modifier les valeurs /HEAP ou /STACK au niveau du linker de
visual C mais rien n'y fait.

Auriez vous une id=E9=E9.=20
Merci d'avance
S=E9bastien

3 réponses

Avatar
Arnaud Debaene
seb wrote:
Bonjour,

J'ai un problème avec un OCX.
Celui ci permet d'instancier en RAM des images assez volumineuses via
une interface VB.

Or, après quelques changements de résolutions, les allocations me
renvoient "NULL". (bien sur , une libération est faite avant chaque
allocation...)

Je pense que c'est lié au tas , ci joint les trace du debugger MS :

(298.338): Access violation - code c0000005 (first chance)



Une access violation, c'est que tu essaies d'accéder à une zone mémoire où
tu n'a pas le droit d'accéder (soit tu déréferences un pointeur invalide,
soit tu libère 2 fois le même bloc mémoire, etc...)

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax41d498 ebx410000 ecx000002 edx4ce508 esi4cf000
edi4ce508
eipwfcca14 esp12e760 ebp12e76c iopl=0 nv up ei pl nz na po nc
cs1b ss23 ds23 es23 fs3b gs00 efl010206
ntdll!RtlFreeHeap+0x3d0

J'ai beau modifier les valeurs /HEAP ou /STACK au niveau du linker de
visual C mais rien n'y fait.


Normal : c'est un bug de manipulation de pointeur dans ton code (à vu de
nez, un double delete, mais impossible d'en dire plus sans une stack trace
complète).

Arnaud
Avatar
seb
Merci pour l'info.

Pour les allocations et desallocations, je passe par une DLL codée par
un de nos fournisseurs, c'est donc une boite noire pour moi...
Or j'en ai parlé avec eux au tel; ils sont surs des allocations et
desallocations memoire; pour eux, ceci provient de la quantité de
memoire dispo. Je dois avoir environ 24Mo de RAM dispo quand le
programme tourne .J'alloue et désalloues 3 images à la voléé
d'environ 1Mo l'image ; je pense donc que c'est vraiment lié au tas
(le problème n'apparait pas toujours au meme moment).

Je sais que sous VC, il est possible de modifier la taille du tas
allouée par process (Windows alloue un tas avec une taille maxi figée
pour chaque process). Cependant, les options de compil (d'apres ce que
j'ai compris sur MSDN) ne fonctionnent que pour les executables; or ici
, il s'agit d'un OCX.
L'interface, elle, est faite en VB et coté VB il n'y as pas de
possibilité de modifier la taille de la zone allouée pour le tas.

Sébastien.
Avatar
adebaene
seb wrote:
Merci pour l'info.

Pour les allocations et desallocations, je passe par une DLL codée par
un de nos fournisseurs, c'est donc une boite noire pour moi...


*Toutes* tes allocations? Tu ne fais jamais un new ou un malloc dans
ton code? Tu n'utilises jamais une classe qui fait de l'allocation en
interne (vector, string, etc...) ??? Tu n'utilises jamais un pointeur
(ou un tableau C)? J'ai du mal à y croire...


Or j'en ai parlé avec eux au tel; ils sont surs des allocations et
desallocations memoire; pour eux, ceci provient de la quantité de
memoire dispo. Je dois avoir environ 24Mo de RAM dispo quand le
programme tourne .


Quand je voie çà, je commence à prendre peur : ce qu'il te faut,
c'est 24 MO de mémoire virtuelle disponible, certainement pas 24Mo de
RAM... So ton fournisseur ne fait pas la diffférence, c'est
inquiétant...

J'alloue et désalloues 3 images à la voléé
d'environ 1Mo l'image ; je pense donc que c'est vraiment lié au tas
(le problème n'apparait pas toujours au meme moment).


Ca ne proouve rien : si le programme est multithread, les erreurs ne
sont pas reproductibles....

Je sais que sous VC, il est possible de modifier la taille du tas
allouée par process (Windows alloue un tas avec une taille maxi figée
pour chaque process).


Non : le heap par défaut peut grandir selon les besoins...
Heureusement, sinon il ne serait pas possible d'allouer plus de 1Mo
avec malloc, new, etc...

Voire
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib /html/msdn_heapmm.asp
ou bien "Inside Windows 2000" pour les détails, mais je t'assure que
ca ne pose *aucun* problème d'allouer 24 Mo d'un coup sur un Windows
classique.


Cependant, les options de compil (d'apres ce que
j'ai compris sur MSDN) ne fonctionnent que pour les executables; or ici
, il s'agit d'un OCX.
L'interface, elle, est faite en VB et coté VB il n'y as pas de
possibilité de modifier la taille de la zone allouée pour le tas.



Tu ne cherches pas le problème du bon côté : ton problème est dû
à une erreur de manipulation de pointeur, pas à une limitation de
Windows! Tu ne peux pas avoir une stack-trace complète au moment de
l'exception?

Arnaud