2016-12-02 11 views
1

ClrMDを使用して、特定のプロセス内で実行されているすべてのスレッドのスタックトレースをダンプしようとしています。コードは私の開発環境では正常に動作しますが、運用サーバーでは正常に動作しません。ClrMDはプロダクションサーバのプロセスにアタッチできません

サーバが稼働している:のWindows Server 2012 R2の標準

は私が受け取るエラーは、次のとおりです。

がプロセスにアタッチできませんでした。エラー0

This postは、私がやろうとしていた別のユーザープロセスにClrMDを接続する方法を尋ねます。私はWindowsサービスとして実行しているプロセスを終了し、ClrMDを実行しようとしているのと同じユーザーとして起動しました。私はまだエラーが発生します。

ユーザーにprivlidgesをデバッグしようとしましたが、それでも解決できませんでした。

私は問題は、プロダクションサーバーの設定方法と関係があると思います。私は管理者権限を持っています。

次に何をすべきかに関するご意見はありますか?

enter image description here

コード:

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)); 
      } 
     } 
    } 
} 

答えて

0

プロセスの名前が生産に比べて私の開発環境で異なっていたことが分かりました。

プロセスの名前を修正すると、エラーが修正されました。

関連する問題