Analyzing memory dump to find leak - c#

We have a c# .NET application that has a memory leak in it. I used procdump to get a memory dump from a running instance of the application from a production machine. The production machine is running 32 bit Windows XP, and .NET 4.0.
The exe config is set to .net 4.0
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
When I pull the dump to my dev box, windows 8.1 64bit, and open it with VS 2013 the dump is initially opened fine. However, when I click the Debug Managed Memory action I get the following error message:
Memory analysis is not supported for the CLR version used in this process.
I'm new to troubleshooting memory leaks in Windows and managed memory environments, and know next to nothing about the tools involved. I did a google search for the error I get, and didn't find anything. Any help is appreciated. I apologize if I am missing something obvious - Junior Dev here :-)

I don't know if procdump can be used to find a memory leak in .NET. One effective way I tried is: using Windbg and SOS. There are two posts explains how to use Windbg+ SOS to track .NET memory leaks:
Where's your leak at? [Using WinDbg, SOS, and GCRoot to diagnose a .NET memory leak]
Debugging managed code memory leak with memory dump using windbg
If you don't like Windbg, the tool DebugDiag is also very effective tool in tracking down memory leaks.

See this link, it only works on process running under .Net 4.5
Before I begin, there are a few things to note about the "Debug
Managed Memory" feature discussed in this post:
The option will only be available from the dump summary page in the
Ultimate version of Visual Studio 2013. If you are using Premium or
Professional you will not see the option
The process the dump file was collected against must have been running on .NET 4.5 or higher. If the dump was collected on 3.5 or
previous the option will not appear, if it was collected on 4.0 it
will fail to launch with an error message.

Starting with Windows 7 /Server 2008 R2 there is a way to create a clone of a process and create a dump of this clone so that the process you care about doesn't need to be suspended. Use procdump -r to use this feature when capturing a dump.
You can also use capture a ETW trace and analyze the data with PerfView.
https://superuser.com/questions/846079/how-can-i-create-a-memory-dump-of-a-production-system-without-affecting-performa/846156#846156

Related

Running .Net application on visual studio code in MacBook pro

I am doing C# programming in Visual Studio Code in MacBook Pro, so whenever I run the application, a dotnet process is left in the memory, when I open the Activity Monitor the memory is not disposed, and the CPU is running at 100% even after the debugging is stopped. Is something wrong with my code or is there anything else that I should be doing while writing c# code in Mac OS. Please let me know, right now after every run I am opening activity monitor and force quitting the process.
You just need to have .Net Core and C# extension installed.
The High CPU consumption is often caused by an issue in an extension.
You can open the Process Explorer using Help>Open Process Explorer to view the list of running VS Code processes running in real-time where you'll find what is causing High CPU consumption where extensions are executed by the Extension Host process.
If the High CPU consumption isn't caused by VS Code then it's probably your code and you'll have to optimize it.
You can check the Performance Issues Wiki for more details here

Unable to launch UWP Application using .Net Memory Profiler

I want to see my UWP Application performance and Memory Leakage using .Net Memory Profiler. When I am trying to launch my application I am getting below error.
May I know how to run my application using .Net Memory Profiler.
This may not be an answer to why .NET memory profiler does not work with UWP, but here is an alternative.
Visual Studio 2015 and above come in-built with visual diagnostic tools that let you quickly identify memory and performance related issues. Take a look at Tools for profiling and performance

Profiling managedCuda in Nsight or Visual Profiler

I'm trying to profile an CUDA-application written in C# with managedCuda using either Nsight Visual Studio Edition or Visual Profiler. Both profilers work well with a plain C++ CUDA app. To test the profilers with managedCuda I want to profile the project "vectorAdd" in ManagedCudaSamples.
First I tried to use Nvidia Nsight Visual Studio Edition 5.0 integrated in VS 2013. I use the x64 Debug configuration. If I try to launch the app in "Application Control" in Nsight Performance Analysis I get an error message:
Analysis Session - Start Application
Unable to launch 64-bit managed application '...\ManagedCudaSamples\vectorAdd\bin\x64\Debug\vectorAdd.exe'.
Additionally I tried to use Nvidia Visual Profiler 7.5 for profiling the same application. On running vectorAdd.exe nvprof console shows the following output:
==2944== NVPROF is profiling process 2944, command: ...\ManagedCudaSamples\vectorAdd\bin\x64\Debug\vectorAdd.exe
==2944== Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.
==2944== Generated result file: ...\nvvp_workspace\.metadata\.plugins\com.nvidia.viper\launch\7\api_2944.log
I'm new to CUDA and would be thankful for any advice how to profile managedCuda applications.
You need to call CudaContext.ProfilerStop() just before you exit the application (or destroy the context) in order to flush the collected data to the profiler. The managedCuda samples don't include this call why the profiler doesn't see the collected info. This explains the second error you get.
And regarding the first error:
In the release notes of Nsight 5.0 you can find a known issue:
Managed applications built with the AnyCpu configuration are not supported. The target application must be built using either the Win32 or x64 configurations.
The VS-project for vectorAdd is always set to AnyCPU, regardless what the solution platform is, see the configuration manager of the managedCuda samples-solution to change that.

.NET application memory usage Visual Studio 2005

I've got a C# application running on Windows CE smart device and I recently added a new graphing option which results in a "OutOfMemory" exception after running for a few hours. How do I find what is going wrong? The code looks fine, its based on one of the previous graphing options that runs for weeks without a problem.
I've tried the Debug > Windows > Memory options in VS 2005, but they all give the message "Unavailable when debuggee is running." I've also tried attaching to the process using the remote debugging tools (specifically the Windows CE Remote Process Viewer), but there's not enough functionality to see what I'm looking for.
Are there tools in VS 2005 to analyse either a remote C# app or one running locally (ie. Win32)?
a) see Memory profiler for .NET Compact Framework
b) see CF remote performance and ... viewer: http://www.microsoft.com/en-us/download/details.aspx?id=13442&751be11f-ede8-5a0c-058c-2ee190a24fa6=True
looks like you have a memory leak in code.

How to find native memory leak in .net application?

I have application written in C#. Memory usage shows that there is a memory leak. However, dotTrace shows that managed memory is OK, so I think that leak occurs in native memory (yes, there are some native calls in my application). How can I find the problem?
Thanks!
I would take a memory dump of the running application, and then use Windbg or Visual Studio 2010 to investigate the issue.
Related resources:
How to research unmanaged memory leaks in .NET?
Windbg on Wikipedia
Analysing dump files with Visual Studio 2010

Categories