//Cloud notes from my desk -Maheshk

"Fortunate are those who take the first steps.” ― Paulo Coelho

What is GDI Object leaks and tips to detect..

Recently I worked for an office issue where Excel 2013 goes to frozen state after executing some time consuming VBA code/macro. It did some operations like – copy ranges and pasted over another sheet within the same workbook. The copy and paste operation iterates over some 100 thousand times depends on the data row etc. It took nearly 3-4 hours to complete the whole copy operation due to data density spreads to x columns with x number of rows.

Problem identification: We saw the application was very much alive but could not able to click or respond to our mouse events like maximize/minimize. Moreover it was slowing the system performance as well. We could not able to figure out the cause in the initial stage. But we tried tools like Procmon, windbg dumps, VMMAP etc could not give that heads up. But after checking the task manager GDI count, we come to know that this is sort of object leak – GDI Leaks creating this hang state/lock situation.

How to identify the GDI object leaks? It is so simple to check such leaks from the task manager itself. Launch the taskmanager > details tab > right click any of the existing column > then ‘Select Columns” enable GDI Object to get added to the details process grid. From there you can keep a note of the count to conclude whether its a GDI leak or not. Typically, you would find this count in hundreds, but in case if you notice them in thousands and also incremented, then something sure to do with GDI leak fix.

What is GDI Objects? According to this MSDN article – GDI Objects are resources that are managed by GDI32.DLL on behalf of an application. Some of the common GDI Objects we consume directly/indirectly through code – Device Contexts (DCs), Bitmaps, Brushes, Fonts, Metafiles, Pens, and Regions etc. These objects gets created using API call but when never gets destructed after usage – this would lead to this leak situation. As like in .NET, it is recommended to dispose of when not interested with that ready to cleaned objects. Of-course, we do this very judiciously, but at times when our code path not cleaned after some exception or some condition branching stops us to do so, then this would be a show stopper for sure :).

What is the limit? It is limited to 64,536 (64k) GDI handles per user session- across all process. But for any individual process, the upper limit is 10000. System allows us to create these many handles and then halts after reaching this limit. You could also try tweaking this limit from registry, but generally not advised to do so due to various reasons like -affects other application performance etc.

What happens after reaching this 10,000 limit? The application would be alive as I said earlier but of no use. It is starving to create further GDI Objects to render it but indefinite halt after that due to no more Create handles permitted. When an application goes out of resources, then the create API call to functions like CreateFont, CreateDC etc would fail with this error : ERROR_INVALID_HANDLE.

There are some tools and guidance to research more on this, but I see very limited materials around this in net. I suggest the below links.

Very old cached MSDN article(thanks to google cache) http://webcache.googleusercontent.com/search?q=cache:XOnUN-jJpGoJ:msdn.microsoft.com/magazine/efea0849-057a-42b7-a5bf-a106bd38faa2&hl=en&gl=in&strip=0&vwsrc=0

Debugging a GDI Resource Leak
http://blogs.msdn.com/b/dsui_team/archive/2013/04/23/debugging-a-gdi-resource-leak.aspx

Suggested to try these Office June updates in case of such leaks
https://support.microsoft.com/en-us/kb/2817579 (enhances copy paste operation speed)
https://support.microsoft.com/en-us/kb/3054794 (some fixes around object leaks)

This slideshow requires JavaScript.

Update : 19-July
From scott blog, I found this nice tool to see the GDI count under types – http://www.nirsoft.net/utils/gdi_handles.html

Advertisements

2015-07-02 Posted by | .NET General, Memory, windbg | , , , | 1 Comment

Various ways to manage Azure resources explored

I just saw scott post on Azure Resource API lib intro. I thought let me think over all possible ways(recollect) today used to manage Azure Resources like VM, Websites, jobs etc from ones desktop.

1) https://portal.azure.com – famously called azure preview portal.

2) https://manage.windowsazure.com – old portal or manage azure portal.

3) Azure PowerShell PowerShell is a friendly tool for infra guys/DevOps/Admin who manages and automate stuffs using PS commandlets, or advanced stuff like DSC -Desired State configuration, puppet,chef etc.

> There are lot of infra tools available in market place.

4) Azure Resource Manager API –  over REST API – fire commands like PUT,GET,POST from your browser. You could also use ARM client here. It is really nice cmd utility with simple commands written by David E

5) Microsoft Azure Cross Platform Command Line (separate installer available for Mac and windows) – azure-xplat-cli

6) From your managed .NET code too – Microsoft Azure Management Libraries 2.0.0

> Scott H explained how one could do this coding here

7) Using Visual Studio Server Explorer – explained here.

P.s: Let me know if you have any comments regarding this and any other ways left out. 

Update:June-2

8) Blob Transfer Utility for Windows Azure Blob Storage  – https://blobtransferutility.codeplex.com/ read via – http://geekswithblogs.net/tmurphy/archive/2015/05/28/azure-utilities-you-should-have-in-your-toolbox.aspx 

2015-04-12 Posted by | .NET General, Azure, Azure Tools | | 1 Comment

Certified for 70-487 !! [ recently cleared 70-532 too ]

Last week I have cleared my 70-487 Developing Microsoft Azure and Web Services certification. I have started preparing for 45+ days on and off, mostly weekend reading and able to clear through second shot offer. There are plenty of materials there to prepare, but I urge to stick with official curriculum + MVA (microsoft virtual academy videos) for this exam. I had internal employee measure up account with some sample questions, with deep understanding of all those concepts + small hands on helped me crack it. Here is what you will learn through this certification,

9780735677241f1256.70-532_3E18159EChapter 1) Accessing Data using – EF, WCF DataServices, Azure Data Storage, Transaction, Caching, XML ds (data). ..

Chapter 2) Querying and Manipulating data by using EF – LINQ to Objects, entities, ADO.NET, EF, Lazy loading,data model…

Chapter 3) Designing and implementing WCF Services – SOA concepts, WCF API obj and config, Securing, consuming, version, Azure Service bus, one way-two way, hosting..

Chapter 4) Create and consume Web API based services – Design a web api, implement, secure, host and consume web api web services

Chapter 5): Deploying web application and Services- Design, deployment strategy, Configure, manage packages using Nuget, create, configure and publish a web package, share assemblies.

Overall, we  will learn back-end programming/db programming + infra projecs like publishing, nuget, etc also helps us to uinderstand end -to end.

Study notes from Chris – http://www.bloggedbychris.com/2013/01/24/microsoft-exam-70-487-study-notes/

[Update: May first week  – I have cleared 70-532 🙂 ]

2015-04-08 Posted by | .NET General, Certification | , , , , | Leave a comment

Debugview.exe as rescue tool

DebugView is a developer friendly tool helps you to monitor debug output messages from local or nw system – from managed/unmanaged code. Recently I was debugging managed COM dll created in C# consumed in office application. I wanted a tool to debug end to end, Let say, your Office files VBA macro calls .NET COM dll for processing some complex logic and then returns the value to your macro.

In dev environment, we usually attach VS to the application and debug them, in VBA using debug.print statements. Assume that, you don’t have VS at your production server or customer machine where you wanted to debug them badly. Here is where debugview comes for rescue.

To write, debug statements from managed code, use Diagnostic having Debug.writeline. For VBA, use OutputDebugString. For other languages – use as here.

C#:- System.Diagnostics.Debug.WriteLine("This is from .NET before word instance.");

VBA:- Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
Private Sub DebugPrint(dbgOutput As String)
OutputDebugString dbgOutput
End Sub
Sub test()
DebugPrint ("Test message for the debugger")
End Sub

Note: Make sue you run as “Admin”.

debug1

debug

2015-03-22 Posted by | .NET General, Office | , , , | Leave a comment

Memory explained by Mark Russinovich

Pushing the Limits of Windows: Physical Memory
http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx

Pushing the Limits of Windows: Virtual Memory
http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx

Pushing the Limits of Windows: Paged and Nonpaged Pool
http://blogs.technet.com/b/markrussinovich/archive/2009/03/26/3211216.aspx

2015-03-04 Posted by | .NET General | | Leave a comment

Troubleshooting masterpiece by Mark Russinovich – Weekend Read. (from TechEd NA-2014)

It is always funny, geeky, informative and casual when listening to Mark Russinovich Tech-ed session. It made my weekend 🙂

Be sure to watch this – especially blue screen one. http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/WIN-B354#fbid=

Mark Russinovich.jpg

2014-12-08 Posted by | .NET General, 100 % Fun...[really Worth] | | Leave a comment

%d bloggers like this: