[.NET] Une erreur générique s'est produite dans GDI+

Bonjour,

Voilà,

je suis entrain de me mettre à ASP.NET, et donc je recopiais un petit code de la MSDN pour appréhender un peu les images et C# :   private void CreateBitmap()
  {
  System.Drawing.Bitmap flag = new System.Drawing.Bitmap(10,10);

&nbsp; for (int x = 0 ; x < flag.Height ; ++x)
&nbsp; {
  &nbsp; for (int y= 0 ; y < flag.Width ; ++y)
  &nbsp; {
	&nbsp; flag.SetPixel (x,y,Color.Green);
  &nbsp; }
&nbsp; }
&nbsp; for (int x = 0 ; x < flag.Height ; ++x)
&nbsp; {
  &nbsp; flag.SetPixel(x,x,Color.Red);
&nbsp; }
&nbsp; flag.Save(Server.MapPath("test.bmp"),System.Drawing.Imaging.ImageFormat.Bmp);
&nbsp; flag.Dispose();

  }
Et quand j’appelle la méthode dans Page_Load, il me marque l’erreur suivante :

 
Une erreur générique s’est produite dans GDI+. Description : Une exception non gérée s’est produite au moment de l’exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d’informations sur l’erreur et son origine dans le code.

Détails de l’exception: System.Runtime.InteropServices.ExternalException: Une erreur générique s’est produite dans GDI+.

Erreur source:

Ligne 42&nbsp;: } Ligne 43&nbsp;: Ligne 44&nbsp;: flag.Save(Server.MapPath("test.bmp"),System.Drawing.Imaging.ImageFormat.Bmp); Ligne 45&nbsp;: flag.Dispose(); Ligne 46&nbsp;: 

Fichier source : c:inetpubwwwrootwebapplication1webform1.aspx.cs Ligne : 44

Trace de la pile:

[ExternalException (0x80004005): Une erreur générique s'est produite dans GDI+.] System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) System.Drawing.Image.Save(String filename, ImageFormat format) GenImage.GenImage.CreateBitmap() in c:inetpubwwwrootwebapplication1webform1.aspx.cs:44 GenImage.GenImage.Page_Load(Object sender, EventArgs e) in c:inetpubwwwrootwebapplication1webform1.aspx.cs:52 System.Web.UI.Control.OnLoad(EventArgs e) System.Web.UI.Control.LoadRecursive() System.Web.UI.Page.ProcessRequestMain() 

J’ai pourtant tous les accès en écriture et execution… je ne comprends pas

Ca dépend. Tu as VisualStudio et tu le lances sous le mode Debug ? Tu le lances normalement par un navigateur.
Qui a les droits ? Toi ? Le compte ASPNET ?
C’est sur que de voir que c’est la méthode Save qui plante, ça laisse penser à une histoire de droits…

Pfff je sais pas repondre avec juste ca comme info alors que en plus c’est plus ou moins moi qui suis responsable de System.Drawing maintenant… arf… Je viens de tester sur ma machine et un copy/paste de ce code appelle dans le Page_OnLoad marche nikel. Ca m’a cree une chti’t image verte avec une ligne diagonale rouge comme on s’y attend. Tu as fait ca bien en plus tu appelle Dispose et tout moi je dit respect (j’aurais mis un using plutot c’est plus compact comme ca et ca revient au meme, et si ton save lance une exception, ca dispose quand meme…)

private void CreateBitmap() {
using (Bitmap flag = new Bitmap(10,10)) {

 for (int x = 0 ; x < flag.Height ; ++x) {
 &nbsp; for (int y= 0 ; y < flag.Width ; ++y) {
&nbsp;   &nbsp; flag.SetPixel (x,y,Color.Green);
 &nbsp; }
 }

  for (int x = 0 ; x < flag.Height ; ++x) {
  flag.SetPixel(x,x,Color.Red);
   }
flag.Save(Server.MapPath(“test.bmp”),
System.Drawing.Imaging.ImageFormat.Bmp);
 }
}
Sinon, je sais pas… essaye d’attacher un debugger ou de regarder si dans InternalException tu as qqch. Tu sais te servir de cordbg?

Petit cours, pour me rattraper de pas savoir repondre. Tu lances un cmd prompt avec les sdk dans le path (ou le visual studio command prompt). Tu tapes “cordbg”

Ensuite tu tapes “pro” pour avoir la liste des process Managed qui tournent.

Sur ma machine:

(cordbg) pro
PID=0xd40 (3392)  Name=C:WINDOWSMicrosoft.NETFrameworkv1.1.4322aspnet_wp.exe
  ID=1  AppDomainName=DefaultDomain
PID=0xd20 (3360)  Name=D:DevelVisualStudio.Net2003Common7IDEdevenv.exe
  ID=1  AppDomainName=DefaultDomain

Ensuite tu t’attache au process:

Tu tapes "a " ici 3392.

La il va te dire qu’il trouve pas les symbols pour les truc de framework (c’est normal).

Apres tu tapes “ca ex” pour lui dire de breaker des qu’une exception est lancee.

Apres tu tapes “g” pour relancer l’execution du machin.

Tu ouvres ta page… et paf, si exception il y a tu vas voir l’exception. Tu peux essayer apres “p $exception” pour afficher l’exception ou meme “p $exception.”. Enfin tout ca pour dire que c’est comme ca qu’on peut debugger en ligne de commande sur n’importe quelle machine qui a le sdk installe. Si vous etes sage une fois je vous expliquerais comment on peut debugger n’importe quel logiciel MS avec windbg et le serveur de symbole pour avoir des numeros de ligne et les noms des variables et tout meme en code natif, comment matter la stack en natif/managed et voir si le marshalling se fait bien quand on passe de .Net a du code natif, comme dans le cas de GDI+  Windbg est un peu cryptique mais ultra ultra puissant, vraiment a essayer si vous connaissez pas encore et que ca vous fait pas peur.

C’est tres drole de breaker dans windows Si vous avez pas peur, en cas de blue screen vous pouvez meme vous attacher avec un deuxieme PC au pc qui a plante par le port serie, charger les symboles du serveur de symbole et avoir le numero de ligne et le nom du fichier ou le plantu s’est produit vu qu’il fait aussi du kernel mode debugging. Ca ou alors charger un des “dump” ou “mini dump” et examiner toute la stack comme si vous vous etiez attache un PC juste au moment du plantu… C’est ce que font les inge de MS quand vous cliquez sur “envoyez” apres un crash et que ce qui a plante est du code appartenant a MS (et pas a un fabriquant de driver ou un soft tiers, dans ce cas la, ils font suivre a ceux qui le demandent).

Putain GDI+ et ses messages d’erreur… “Generic Exception…” t’inquiete, j’ai deja mis des claques au dev qui a ecrit ca…

Ce message a été édité par GloP le 25/04/2004
Ce message a été édité par GloP le 25/04/2004

[quote]Ca dépend. Tu as VisualStudio et tu le lances sous le mode Debug ? Tu le lances normalement par un navigateur. Qui a les droits ? Toi ? Le compte ASPNET ? C’est sur que de voir que c’est la méthode Save qui plante, ça laisse penser à une histoire de droits…[/quote]J’ai essayé les 2 méthodes (en lançant avec VS et à partir du navigateur) mais çà fait la même chose. Au niveau des droits, je pense que c’est VS qui s’occupe de tout (Authentification Windows intégré, donc je pense que c’est mon compte administrateur.)

Apparemment, au niveau des droits, tout est bon. J’ai tout coché dans l’onglet ‘Répertoire’ des propriétés de WebApplicaltion1.

Tu as fait ca bien en plus tu appelle Dispose et tout moi je dit respect (j’aurais mis un using plutot c’est plus compact comme ca et ca revient au meme, et si ton save lance une exception, ca dispose quand meme…)

J’ai corrigé, merci

Sinon j’ai essayé cordbg ( à partir de VS prompt parce que je n’ai pas trouvé à partir du cmd classique ) et çà me donne çà :

c’est vrai que çà a l’air puissant (et marrant, quand on quite cordbg, l’appli se charge comme si rien ne s’était passé…) mais je ne sais pas exploiter les informations qui s’affichent.
Ce message a été édité par EzecKiel le 25/04/2004

[quote] Au niveau des droits, je pense que c’est VS qui s’occupe de tout (Authentification Windows intégré, donc je pense que c’est mon compte administrateur.)

Apparemment, au niveau des droits, tout est bon. J’ai tout coché dans l’onglet ‘Répertoire’ des propriétés de WebApplicaltion1.[/quote]nope, c’est pas le compte admin. Ton appli s’execute dans un worker process séparée de IIS, et donc dans le contexte user ASPNET. Donc, en sus des droits au sein de IIS, vérifie que l’user ASPNET à les droits d’écriture (au niveau NTFS) dans le rep ou tu tentes d’écrire le bmp.

Sinon je confirme, si t’as pas les droits, ca fait cette erreur apparement. GDI+ et ses messages d’erreur… pfff…

Bon bah à tous les coups c’est çà, je regarderai çà demain.

Merci  !!!

Comme dirait José Garcia quand il raconte l’histoire de l’Ours Bleu (Rires et Châtiments) : “AAAAAARRRRR PUTTTTTTTAAAAAAINNNNNNNNNNN”

Excusez-moi mais quand on est énervé çà soulage

Le fait est que quand j’ai cherché une première fois si c’était un problème de droit, j’ai regardé dans les propriétés du dossier. Mais comme je connais XP très peu ( à force de  dire XP et 2000 c’est la même chose on finit par y croire et ne pas chercher les différences) je ne savais pas qu’il fallait désactiver l’option ‘Utiliser le partage simple’ pour avoir accès à la gestion des droits par utilisateur sur les dossiers. D’où mon explication foireuse (“VS doit gérer çà…”).

Effectivement c’était un putain de problème de droits de dossiers.

PS : je trouve çà un peu surprenant que cette case soit coché par défaut, étant donné que dans WinXP Pro, il y a pro (sous-entendu, les ‘pros’ ils connaissent ces histoires de droits)