2

I am trying to use ClrMD to dump the stacktrace of all threads running within a specific process. The code works fine in my devlopment enviornment but not on the production server.

The server is running: Windows Server 2012 R2 Standard

The error I recieve is:

Could not attach to process. Error 0.

This post asks how to attach ClrMD to another users process, which was what I was trying to do. I terminated the process (which is running as a windows service) and started it as the same user that I am trying to execute ClrMD with. I still get the error.

Tried giving the user debugging privlidges but that didnt help either.

I bet the problem has something to do with how to production server is configured. I have administrator rights.

Any suggestions on what to do next?

enter image description here

Code:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.Diagnostics.Runtime;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            int pid = 0;
            var result = new Dictionary<int, string[]>();
            var targetProcessName = "Dist.TingbogScraper.Business.TingbogScraperService.vshost";
                // Change this to the process you are looking for
            var outputPath = "C:\\temp\\ClrMDresult.txt";
            var exceptionOutput = "C:\\temp\\ClrMDdump.txt";

            var processes = Process.GetProcesses();

            foreach (var process in processes)
            {
                if (process.ProcessName.Contains(targetProcessName))
                {
                    pid = process.Id;
                }
            }

            try
            {
                using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Passive))
                {
                    ClrRuntime runtime = dataTarget.ClrVersions.First().CreateRuntime();

                    foreach (var t in runtime.Threads)
                    {
                        try
                        {
                            if (t.StackTrace != null)
                            {
                                result.Add(
                                    t.ManagedThreadId,
                                    t.StackTrace.Select(f =>
                                    {
                                        if (f.Method != null)
                                        {
                                            return f.Method.Type.Name + "." + f.Method.Name;
                                        }

                                        return null;
                                    }).ToArray()
                                );
                            }
                        }
                        catch (Exception ex)
                        {

                        }
                    }
                }

                foreach (var kvp in result)
                {
                    var value = kvp.Value;
                    foreach (var stacktrace in value)
                    {
                        System.IO.File.AppendAllText(outputPath,
                            string.Format("{0} {1} {2}", kvp.Key, stacktrace, Environment.NewLine));
                    }
                }
            }
            catch (ClrDiagnosticsException ex)
            {
                System.IO.File.AppendAllText(outputPath,
                            string.Format("{0} {1} {2}", ex.Message, ex.StackTrace, ex.Source));
            }
        }
    }
}
Community
  • 1
  • 1
Kenci
  • 4,794
  • 15
  • 64
  • 108

1 Answers1

0

Found out that the name of the process was different on my development environment compared to production.

Correcting the name of the process fixed the error.

Kenci
  • 4,794
  • 15
  • 64
  • 108