C# GDI+ error és ContextMenuStrip

C# GDI+ error és ContextMenuStrip
2017-09-19T14:50:43+02:00
2017-09-22T20:53:06+02:00
2022-10-15T22:40:55+02:00
Peter17
Sziasztok!

C#, VS2015, Win10

Néhány óránként egy „A generic error occurred in GDI+.” hibát kapok (a teljes hibaüzenet a végén). Sajnos nem tudom behatárolni, ill. valamilyen módon közvetlenül előidézni, segítségetekre van szükségem, hogy tovább tudjak lépni. A kulcsszavakra természetesen rákerestem, napok óta ezzel foglalkozok, de nagyon nehezíti a helyzetet, hogy fél naponta, ill. több óránként van a jelenség.

Leírás:
1. Hálózati adatátviteli sebesség megjelenítő program, a fő infó a form háttérképeként jelenik meg bitmap grafikonként, a háttárkép doublebuffered.
2. A form tartalmaz egy panelt, a panel három labelt, ezeken szövegesen is megjelennek az aktuális sebesség infók.
3. Van két timer, az egyik ütemezi az aktuális sebesség kiolvasást, tömbbe eltárolást, a bitmap grafikon rajzolást és a háttérképként történő megjelenítést.
4. A másik timer a labeleken megjelenő információt ütemezi. Erre azért van szükség mert ha a grafikus megjelenítés gyors, akkor a karakteres megjelenítés a gyors változások miatt kiértékelhetetlen.
5. Van egy notifyicon, az ikonja az aktuális le- és feltöltési sebességekből rajzolt bitmap kép ikon formátummá konvertálva. Ez egy mini folyamatjelzőként működik, hogy a grafikont tartalmazó form rejtett állapotában is legyen minimális grafikus infó.
6. Egy contextmenustrip a formra és ugyanez a notifíiconra állítva.
7. A hiba akkor jelentkezik, ha a formon a context menüt aktivizálom. Akár több száz jobb egérgombos kattintás és akár több órás folyamatos működés után. Ilyenkor a context menü feliratok nélkül megjelenik, mint amikor tiltott állapotban van az összes felsorolt menüpont és a jelzett hibával kilép. Másik gépen is ugyanez a helyzet.

A teljes hiba üzenet:

System.Runtime.InteropServices.ExternalException was unhandled ErrorCode=-2147467259 HResult=-2147467259 Message=A generic error occurred in GDI+. Source=System.Drawing StackTrace: at System.Drawing.Image.FromHbitmap(IntPtr hbitmap, IntPtr hpalette) at System.Drawing.Image.FromHbitmap(IntPtr hbitmap) at System.Drawing.Icon.BmpFrame() at System.Drawing.Icon.ToBitmap() at System.Windows.Forms.ThreadExceptionDialog..ctor(Exception t) at System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t) at System.Windows.Forms.Control.WndProcException(Exception e) at System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException:
A jelzett hiba pontos értelmezéséhez, a hiba behatárolásához kérem a segítségeteket...
Mutasd a teljes hozzászólást!
Ha elfogynak a GDI handle-ök akkor van ilyen hibaüzenet. Ez tipikusan akkor van ha valahol leak van programban. Például létrehozol valami unmanaged resourcet például egy fontot, pent vagy bármilyen drawing elementet és utána nem szabadítod fel Dispose-al. Ezeket using-al fel kell szabadítani.
Amúgy a GC ez by default felszabadítja csak az ugye nem determinisztikus ezért simán lehet, hogy hamarabb fogynak el a handle-ök mintsem felszabadulnának. Valószínűleg valahol a határon billeg a dolog és egyszer csak beüt.
A másik probléma még az is lehet, hogy egyszerűen leakel valami és marad referencia ezekre az elemekre és simán elfogynak egy idő után.
Mutasd a teljes hozzászólást!

  • Biztos, hogy ez a teljes hibaüzenet? A .NET-hez nem értek ugyan, de az utolsó sorban az "InnerException:" eléggé azt sugallja, hogy utána fog jönni egy másik stack trace, az előzőt okozó kivétel leírásával. Onnan gondolom, hogy ez a helyzet, mert Javában így szokás (a saját kivételed okaként megadod azt a hibát, amit te magad elkaptál), csak ott "Caused by:" formában íródik ki a stack trace-ben.
    Mutasd a teljes hozzászólást!
  • Sajnos nem tudom direkt előidézni a hibát, ezért most megvárom a következőt, ami az eddigi tapasztalatok alapján fél nap is lehet. Annyit tudtam még csinálni, hogy a Windows eseménynaplóból még két infót idemásolok, ami a legutóbbi hibával jött:

    1. Faulting application name: netgraph.exe, version: 1.0.0.41, time stamp: 0x59bf7d35 Faulting module name: KERNELBASE.dll, version: 10.0.15063.608, time stamp: 0xadaa6ed6 Exception code: 0xe0434352 Fault offset: 0x000eb832 Faulting process ID: 0x1ed4 Faulting application start time: 0x01d3316762f1556d Faulting application path: D:\Dropbox\prov\prog8\netpb\netpb\bin\Debug\netgraph.exe Faulting module path: C:\WINDOWS\System32\KERNELBASE.dll Report ID: 462289cf-ddd5-4179-a9bf-2c3607249ce7 Faulting package full name: Faulting package-relative application ID: 2. Fault bucket 129564877061, type 5 Event Name: CLR20r3 Response: Not available Cab Id: 0 Problem signature: P1: netgraph.exe P2: 1.0.0.41 P3: 59bf7d35 P4: System.Drawing P5: 4.7.2046.0 P6: 589c0722 P7: 352 P8: 0 P9: AMAG3AACMAWG2XAF344U21ACVE5PSTKL P10: Attached files: \?\C:\ProgramData\Microsoft\Windows\WER\Temp\WER8D33.tmp.dmp \?\C:\ProgramData\Microsoft\Windows\WER\Temp\WER8F09.tmp.WERInternalMetadata.xml \?\C:\ProgramData\Microsoft\Windows\WER\Temp\WER8F27.tmp.csv \?\C:\ProgramData\Microsoft\Windows\WER\Temp\WER8F38.tmp.txt These files may be available here: C:\ProgramData\Microsoft\Windows\WER\ReportArchive\AppCrash_netgraph.exe_6895f87116aac7b8a866caef56f0c9f28de7a1c_a091cbb9_3965d9bd Analysis symbol: Rechecking for solution: 0 Report ID: 462289cf-ddd5-4179-a9bf-2c3607249ce7 Report Status: 134217729 Hashed bucket: 1a868a17c48e1153558ea64cc5231272
    Mutasd a teljes hozzászólást!
  • Jelentkezett a hiba, csatolt fájlban küldöm az infót, amit ki tudtam szedni, A hibásnak jelölt ágakat és az általam fontosnak gondolt ágakat bontottam ki. Sajnos ilyen mélységig még nem látom át a helyzetet, ezért lehet, hogy a lényeg lemaradt. Használható-e az infó?
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Életemben nem láttam még ilyen formátumú hibajelentést. Azt hiszem, hagyom ezt a témát olyan embernek, aki jobban képben van a .NET-tel kapcsolatban.
    Mutasd a teljes hozzászólást!
  • Most sikerült egy hibaüzenettel tovább lépni:

    1. System.OutOfMemoryException was unhandled HResult=-2147024882 Message=Out of memory. Source=System.Drawing StackTrace: at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc) at System.Windows.Forms.ToolStrip.OnPaint(PaintEventArgs e) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ToolStrip.WndProc(Message& m) at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException: ***************************** 2. The thread 0x2bcc has exited with code 0 (0x0). 'netgraph.vshost.exe' (CLR v4.0.30319: netgraph.vshost.exe): Loaded 'D:\Dropbox\prov\prog8\netpb\netpb\bin\Debug\netgraph.exe'. Symbols loaded. 'netgraph.vshost.exe' (CLR v4.0.30319: netgraph.vshost.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. The thread 0x614 has exited with code 0 (0x0). The thread 0x31c has exited with code 0 (0x0). The thread 0x3034 has exited with code 0 (0x0). Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll Exception thrown: 'System.Runtime.InteropServices.ExternalException' in System.Drawing.dll
    Mutasd a teljes hozzászólást!
  • Szia,
    rém furcsa a hiba.
    - Amit én megnéznék: van-e írási jog azon a könyvtáron, ahonnan a kép jön (ha onnan jön)
    - Esetleg akkor történik a hiba, amikor az N db timer közül kettő összefut és egyszerre próbál módosítani/kiolvasni valamit?
    Szerintem valami olyasmi lehet, hogy valamelyik függvény hozzá próbál férni valamihez, ami blokkolt állapotú.
    Az is előfordulhat, hogy egy timer elindít egy eljárást, és újra elindítja, de a korábbi még nem ért véget valamilyen okból?
    B
    Mutasd a teljes hozzászólást!
  • Szia, az említett kép a program által generált, másodpercenként 10 darab jön létre, grafikonként fut a form háttérképeként. Több órán át megfelelően működik (vagy úgy tűnik). A kontext menü jobb egérgombos előhívására jelentkezik a hiba, akár több száz jobb egérgomb után. Én is gondolok összeakadásra.

    Csináltam már a kontext menüt ügy is, hogy kivettem a form és a notifyicon properity-ből és mouseclick event által jelenítettem meg, a hiba akkor is volt. Most visszatértem normál (properityben hozzárándelt) kontext menühöz.

    A timer1 viszi a fő ciklust tick eseményben (adatlekésérés, tárolás, grafikon rajzolás) ennek az aktivitási ciklusában tiltottam a kontext menüt, a végén ismét engedélyeztem. Arra gondoltam, hogy talán így nem lesz akadás, de a hina így is jött. A timer2 csak a karaktereres infó megjelenítésével kapcsolatban egy flag-et kapcsolgat a saját tick eseményében. A hiba akkor is volt, amikor nem volt timer2, amúgy ez nem is annyira fontos, máshogy is meg lehet oldani.

    Most is úgy tesztelek, hogy a timer1 ciklusban ne tudjon lenni kontext menü és a notifyicon ikon generálás helyett statikus ikon van (az ikon is hordoz információt, de nem ez a legfontosabb). Mellékelek egy képet is a programről...
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • A probléma oka a dinamikusan létrehozott notifyicon ikonjával kapcsolatos. Az a gond, hogy Icon objektumból Bitmap objektumot nagyon egyszerű létrehozni, de ez fordítva már jóval bonyolultabb. Több lehetőség is van, amit én használtam a CodeProject nem biztonságos módszernek tekinti. Én a hivatalos Microsoft infóból indultam ki, akkor még nem ismertem a  CodeProject cikkét. Amire ez nekem kellett máshogy oldom meg.

    A probléma behatárolásában nehezítette a helyzetet a számomra nem igazán érthető hibaüzenet, valamint a hiba ritka előfordulása. Most, hogy már tájékozottabb vagyok, néhány fórumon hasonlóakat olvastam. További nehézség volt, hogy a kontextmenüvel kapcsolatosan jelentkezett a hiba, ebből valamilyen szinkronitási, ill. szálkezelési problémára is gyanakodtam.

    Köszönöm a privát és publikus hozzászólásokat...
    Mutasd a teljes hozzászólást!
  • Ha elfogynak a GDI handle-ök akkor van ilyen hibaüzenet. Ez tipikusan akkor van ha valahol leak van programban. Például létrehozol valami unmanaged resourcet például egy fontot, pent vagy bármilyen drawing elementet és utána nem szabadítod fel Dispose-al. Ezeket using-al fel kell szabadítani.
    Amúgy a GC ez by default felszabadítja csak az ugye nem determinisztikus ezért simán lehet, hogy hamarabb fogynak el a handle-ök mintsem felszabadulnának. Valószínűleg valahol a határon billeg a dolog és egyszer csak beüt.
    A másik probléma még az is lehet, hogy egyszerűen leakel valami és marad referencia ezekre az elemekre és simán elfogynak egy idő után.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd