ClrMDを使用して、特定のプロセス内で実行されているすべてのスレッドのスタックトレースをダンプしようとしています。コードは私の開発環境では正常に動作しますが、運用サーバーでは正常に動作しません。ClrMDはプロダクションサーバのプロセスにアタッチできません
サーバが稼働している:のWindows Server 2012 R2の標準
は私が受け取るエラーは、次のとおりです。
がプロセスにアタッチできませんでした。エラー0
This postは、私がやろうとしていた別のユーザープロセスにClrMDを接続する方法を尋ねます。私はWindowsサービスとして実行しているプロセスを終了し、ClrMDを実行しようとしているのと同じユーザーとして起動しました。私はまだエラーが発生します。
ユーザーにprivlidgesをデバッグしようとしましたが、それでも解決できませんでした。
私は問題は、プロダクションサーバーの設定方法と関係があると思います。私は管理者権限を持っています。
次に何をすべきかに関するご意見はありますか?
コード:
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));
}
}
}
}