[Mono-list] Error in System.Drawing.GDIPlus:GdipDrawLineI when using third party control

Sebastien Pouliot sebastien.pouliot at gmail.com
Wed May 24 07:59:21 EDT 2006


Hello Paddy,

On Wed, 2006-05-24 at 16:21 +1000, Paddy Joy wrote:
> Hi Sebastien,
> 
> Thanks for the help! By using the trace option I was able to find the 
> cause of the problem, but first some info about my system.
> 
> I'm running Linux, fedora core 5, mono and libgdi from svn (last night).
> 
> The last few lines of the trace suggest that the code is creating a 
> brush and a pen, then disposing of the brush before drawing the line.

This is, sadly, not the first time we have seen this (using disposed
objects) and it's pretty hard to predict what will occur (even on the MS
runtime).

> ENTER: (wrapper managed-to-native) System.Drawing.GDIPlus:GdipCreatePen2 
> (intptr,single,System.Drawing.Unit,intptr&)(0x89eefc8, 1.000000, 0, 
> [BYREF:0xbf2dc], )
> LEAVE: (wrapper managed-to-native) System.Drawing.GDIPlus:GdipCreatePen2 
> (intptr,single,System.Drawing.Unit,intptr&)result=0
> ENTER: System.Drawing.GDIPlus:CheckStatus (System.Drawing.Status)(0, )
> LEAVE: System.Drawing.GDIPlus:CheckStatus (System.Drawing.Status)
> ENTER: (wrapper managed-to-native) 
> System.Drawing.GDIPlus:GdipDeleteBrush (intptr)(0x89eefc8, )
> LEAVE: (wrapper managed-to-native) 
> System.Drawing.GDIPlus:GdipDeleteBrush (intptr)result=0
> ENTER: (wrapper managed-to-native) System.Drawing.GDIPlus:GdipDrawLineI 
> (intptr,intptr,int,int,int,int)(0x89f6b60, 0x89f3b70, 1, 44, 100, 44, )

Yes the brush is disposed but I'm not sure if the pen shouldn't have
kept it's own copy of the brush... The fact that this works on MS
suggest it may be a libgdiplus bug.

(note: we already, and recently, deal with the fact that the Pen.Brush
property can be disposed without affecting the pen itself)

> So it looks like the dodgy third party code is causing the problem, 
> unfortunately this doesn't throw an error on MS .NET so I dont think the 
> producer will be fixing it anytime soon! 

Don't be so sure. Using a disposed object is a real bug that can show up
on MS runtime too. It would be in the best interest of the publisher to
fix this bug before any change to the MS runtime (e.g. a service pack)
start exposing the issue.

That being said, I think it's a libgdiplus bug so no need to report it.

> Maybe I should log a bug with MS ;-) 

Not required.

> I have reproduced the problem in an attached test case.

I'll transform that into a unit test and fix the (probable) issue.
Thanks for providing a precise report!
Sebastien

> Paddy
> 
> 
> 
> Sebastien Pouliot wrote:
> > Hello Paddy,
> >
> > On Tue, 2006-05-23 at 14:26 +1000, Paddy Joy wrote:
> >   
> >> I have been trying to get a third party grid control to work on Mono 
> >> recently, its the Janus Grid control. However I have hit an error that I 
> >> can't really debug because I don't have the source of the control.
> >>     
> >
> > Well you can probably debug it because you have Mono source code for
> > both System.Drawing.dll and libgdiplus. Of course not having the control
> > source code makes it more challenging ;-)
> >
> >   
> >> Anybody got any ideas? 
> >>     
> >
> > There's not enough data to get very useful ideas. In fact your email
> > lacks very basic information, like:
> > * Mono version being used;
> > * Libgdiplus version being used;
> > * Operating system ...
> >
> > As for debugging it yourself, you can use mono build-in trace tool ("man
> > mono" and look for --trace) to get an idea where it failed (and get an
> > idea what the method parameters are).
> >
> > You can also modify either System.Drawing (C#) or libgdiplus (C) to log
> > the parameters used to make the call (with more details and/or at the
> > "right" moment).
> >
> >   
> >> Should I give up and look for an open source 
> >> alternative?
> >>     
> >
> > First things first. If you already invested time and money in this you
> > should start by asking your vendor. If no one ask for Mono support, then
> > no vendor will invest the time to make sure their controls works with
> > Mono.
> >
> >   
> >> Thanks
> >> Paddy
> >>
> >>
> >> Mono System.Windows.Forms Assembly [$auto_build_revision$]
> >> Keyboard: United States keyboard layout (phantom key version)
> >> Gtk colorscheme read
> >>
> >> =================================================================
> >> Got a SIGSEGV while executing native code. This usually indicates
> >> a fatal error in the mono runtime or one of the native libraries
> >> used by your application.
> >> =================================================================
> >>
> >> Stacktrace:
> >>
> >> in (wrapper managed-to-native) System.Drawing.GDIPlus:GdipDrawLineI 
> >> (intptr,intptr,int,int,int,int) <0x4>
> >> in (wrapper managed-to-native) System.Drawing.GDIPlus:GdipDrawLineI 
> >> (intptr,intptr,int,int,int,int) <0xffffffa5>
> >> in System.Drawing.Graphics:DrawLine (System.Drawing.Pen,int,int,int,int) 
> >> <0x3d>
> >> in (wrapper remoting-invoke-with-check) System.Drawing.Graphics:DrawLine 
> >> (System.Drawing.Pen,int,int,int,int) <0x3668>
> >> in Janus.Windows.GridEX.Internal.JNSCC:PaintGridlines 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCK,System.Drawing.Rectangle,bool) 
> >> <0x240>
> >> in Janus.Windows.GridEX.Internal.JNSBJ:PaintGridlines 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCK,System.Drawing.Rectangle) 
> >> <0x81>
> >> in Janus.Windows.GridEX.GridEX:b 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCK,Janus.Windows.GridEX.GridEXFormatStyle,System.Drawing.Rectangle) 
> >> <0x7c2>
> >> in Janus.Windows.GridEX.GridEX:a 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCK,Janus.Windows.GridEX.GridEXFormatStyle) 
> >> <0xa5>
> >> in Janus.Windows.GridEX.GridEX:f 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCJ) <0x9c3>
> >> in Janus.Windows.GridEX.GridEX:c 
> >> (System.Drawing.Graphics,Janus.Windows.GridEX.Internal.JNSCJ) <0x4af>
> >> in Janus.Windows.GridEX.GridEX:g (System.Drawing.Graphics) <0x267>
> >> in Janus.Windows.GridEX.GridEX:e (System.Drawing.Graphics) <0x43>
> >> in Janus.Windows.GridEX.GridEX:OnPaint 
> >> (System.Windows.Forms.PaintEventArgs) <0x137>
> >> in System.Windows.Forms.Control:WndProc (System.Windows.Forms.Message&) 
> >> <0x563>
> >> in Janus.Windows.GridEX.ScrollableBase:WndProc 
> >> (System.Windows.Forms.Message&) <0x52>
> >> in ControlNativeWindow:WndProc (System.Windows.Forms.Message&) <0x14>
> >> in System.Windows.Forms.NativeWindow:WndProc 
> >> (intptr,System.Windows.Forms.Msg,intptr,intptr) <0x11e>
> >> in System.Windows.Forms.XplatUIX11:DispatchMessage 
> >> (System.Windows.Forms.MSG&) <0x16>
> >> in System.Windows.Forms.XplatUI:DispatchMessage 
> >> (System.Windows.Forms.MSG&) <0x15>
> >> in System.Windows.Forms.Application:RunLoop 
> >> (bool,System.Windows.Forms.ApplicationContext) <0x614>
> >> in System.Windows.Forms.Application:Run (System.Windows.Forms.Form) <0x24>
> >> in JanusTest.Form1:Main () <0x1f>
> >> in (wrapper runtime-invoke) System.Object:runtime_invoke_void 
> >> (object,intptr,intptr,intptr) <0x7d085f9>
> >>
> >> Native stacktrace:
> >>
> >>     mono(mono_handle_native_sigsegv+0xbf) [0x81547ef]
> >>     mono [0x8122498]
> >>     [0x9c8440]
> >>     /usr/local/lib/libgdiplus.so(gdip_pen_setup+0x3f) [0x81674f]
> >>     /usr/local/lib/libgdiplus.so(GdipDrawLine+0x118) [0x801ba8]
> >>     /usr/local/lib/libgdiplus.so(GdipDrawLineI+0x40) [0x801c90]
> >>     [0xbd1364]
> >>     [0xbd12ce]
> >>     [0xbd124e]
> >>     [0xbd4821]
> >>     [0xbd4592]
> >>     [0xbc8ae3]
> >>     [0xbc8316]
> >>     [0xbd2244]
> >>     [0xbc7508]
> >>     [0xbc6b38]
> >>     [0xbc63f4]
> >>     [0x223c40]
> >>     [0x699654]
> >>     [0x6990a3]
> >>     [0x699045]
> >>     [0xe45ec7]
> >>     [0x222917]
> >>     [0x2228f6]
> >>     [0x216c65]
> >>     [0x216615]
> >>     [0x3b6708]
> >>     [0x3b57be]
> >>     mono(mono_runtime_exec_main+0x62) [0x80bdd92]
> >>     mono(mono_runtime_run_main+0x152) [0x80beef2]
> >>     mono(mono_main+0xe46) [0x805d106]
> >>     mono [0x805bdb2]
> >>     /lib/libc.so.6(__libc_start_main+0xdc) [0x9fb724]
> >>     mono [0x805bd01]
> >>
> >> _______________________________________________
> >> Mono-list maillist  -  Mono-list at lists.ximian.com
> >> http://lists.ximian.com/mailman/listinfo/mono-list
> >>     
> >
> >   
> plain text document attachment (Form1.cs)
> using System;
> using System.Drawing;
> using System.Drawing.Drawing2D;
> using System.Collections;
> using System.ComponentModel;
> using System.Windows.Forms;
> using System.Data;
> 
> namespace WindowsApplication2
> {
> 	/// <summary>
> 	/// Summary description for Form1.
> 	/// </summary>
> 	public class Form1 : System.Windows.Forms.Form
> 	{
> 		/// <summary>
> 		/// Required designer variable.
> 		/// </summary>
> 		private System.ComponentModel.Container components = null;
> 
> 		public Form1()
> 		{
> 			//
> 			// Required for Windows Form Designer support
> 			//
> 			InitializeComponent();
> 
> 			//
> 			// TODO: Add any constructor code after InitializeComponent call
> 			//
> 		}
> 
> 		/// <summary>
> 		/// Clean up any resources being used.
> 		/// </summary>
> 		protected override void Dispose( bool disposing )
> 		{
> 			if( disposing )
> 			{
> 				if (components != null) 
> 				{
> 					components.Dispose();
> 				}
> 			}
> 			base.Dispose( disposing );
> 		}
> 
> 		#region Windows Form Designer generated code
> 		/// <summary>
> 		/// Required method for Designer support - do not modify
> 		/// the contents of this method with the code editor.
> 		/// </summary>
> 		private void InitializeComponent()
> 		{
> 			this.components = new System.ComponentModel.Container();
> 			this.Size = new System.Drawing.Size(300,300);
> 			this.Text = "Form1";
> 		}
> 		#endregion
> 
> 		/// <summary>
> 		/// The main entry point for the application.
> 		/// </summary>
> 		[STAThread]
> 		static void Main() 
> 		{
> 			Application.Run(new Form1());
> 	
> 		}
> 
> 		
> 		protected override void OnPaint(PaintEventArgs pe)
> 		{
> 			Graphics g = pe.Graphics ;
> 			
> 			HatchBrush h = new HatchBrush((System.Drawing.Drawing2D.HatchStyle)12, Color.FromArgb(-5134956), Color.FromArgb(-1));
> 			
> 			Pen p = new Pen(h, 5);
> 
> 			h.Dispose();
> 
> 			g.DrawLine(p, 10, 10, 100, 100);
> 			
> 		} 
> 	}
> }
-- 
Sebastien Pouliot  <sebastien at ximian.com>
Blog: http://pages.infinit.net/ctech/



More information about the Mono-list mailing list