Tag: system.diagnostics

使用凭据的.NET进程启动进程错误(句柄无效)

我有一个Windows窗体应用程序,它为StartInfo提供用户名,域和密码,它会抛出: System.ComponentModel.Win32Exception: 句柄在System.Diagnostics.Process.Start()的System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)中无效 当我允许凭证默认为当前用户时,我没有得到这样的错误,并且我开始的过程工作到不需要使用凭证的程度(在MSBuild脚本中映射驱动器所需的信用)。 这是填充开始信息的代码: Process p = new Process(); ProcessStartInfo si = new ProcessStartInfo(buildApp, buildArgs); si.WorkingDirectory = msBuildWorkingDir; si.UserName = txtUserName.Text; char[] psw = txtPassword.Text.ToCharArray(); SecureString ss = new SecureString(); for (int x = 0; x < psw.Length; x++) { ss.AppendChar(psw[x]); } si.Password = ss; si.Domain = "ABC"; si.RedirectStandardOutput = true; si.UseShellExecute = […]

如何获得stacktrace中的参数值

我可以通过StackTrace获取有关参数的信息,使用类似的方法: catch (Exception ex) { var st = new StackTrace(ex); System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); } 我想知道我如何获得参数的值。 例: 如果我在堆栈跟踪中的方法是这样的: void MyMethod(object value) 电话就像: MyMethod(10); 我想得到价值10.我怎么做?

CorrelationManager.LogicalOperationStack是否与Parallel.For,Tasks,Threads等兼容

有关背景信息,请参阅此问题: 任务并行库中的任务如何影响ActivityID? 该问题询问Tasks如何影响Trace.CorrelationManager.ActivityId 。 @Greg Samson用测试程序回答了他自己的问题,该程序显示ActivityId在Tasks的上下文中是可靠的。 测试程序在Task委托的开头设置一个ActivityId,hibernate以模拟工作,然后检查最后的ActivityId以确保它是相同的值(即它没有被另一个线程修改)。 该程序成功运行。 在研究线程,任务和并行操作的其他“上下文”选项(最终为日志提供更好的上下文)时,我遇到了Trace.CorrelationManager.LogicalOperationStack的一个奇怪问题(无论如何我都很奇怪)。 我在下面的问题中复制了我的“答案”。 我认为它充分描述了我遇到的问题(Trace.CorrelationManager.LogicalOperationStack显然已经损坏 – 或者什么 – 当在Parallel.For的上下文中使用时,但只有当Parallel.For本身包含在逻辑操作中时) 。 这是我的问题: Trace.CorrelationManager.LogicalOperationStack应该可以与Parallel.For一起使用吗? 如果是这样,如果逻辑操作已经与Parallel.For启动了,它是否会产生影响? 是否有一种“正确”的方式使用LogicalOperationStack与Parallel.For? 我能不同地对这个示例程序进行编码以使其“有效”吗? 通过“工作”,我的意思是LogicalOperationStack总是具有预期的条目数,并且条目本身是预期的条目。 我已经使用Threads和ThreadPool线程做了一些额外的测试,但是我必须返回并重试那些测试,看看我是否遇到了类似的问题。 我会说,看起来任务/并行线程和ThreadPool线程确实从父线程“inheritance”了Trace.CorrelationManager.ActivityId和Trace.CorrelationManager.LogicalOperationStack值。 这是预期的,因为CorrelationManager使用CallContext的LogicalSetData方法(而不是SetData)存储这些值。 请再次参考此问题,以获取我在下面发布的“答案”的原始背景: 任务并行库中的任务如何影响ActivityID? 另请参阅Microsoft的Parallel Extensions论坛上的这个类似问题(目前尚未得到解答): http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/7c5c3051-133b-4814-9db0-fc0039b4f9d9 [BEGIN PASTE] 请原谅我发布这个作为答案,因为它不是你的问题的真正答案,但是,它与你的问题有关,因为它处理CorrelationManager行为和线程/任务/等。 我一直在寻找使用CorrelationManager的LogicalOperationStack (和StartLogicalOperation/StopLogicalOperation方法)在multithreading场景中提供额外的上下文。 我拿了你的例子并稍微修改它以增加使用Parallel.For并行执行工作的能力。 另外,我使用StartLogicalOperation/StopLogicalOperation来括号(内部) DoLongRunningWork 。 从概念上讲, DoLongRunningWork每次执行时都会执行以下操作: DoLongRunningWork StartLogicalOperation Thread.Sleep(3000) StopLogicalOperation 我发现,如果我将这些逻辑操作添加到您的代码中(或多或少),所有逻辑操作都保持同步(始终是堆栈上预期的操作数,并且堆栈上的操作值始终为预期)。 在我自己的一些测试中,我发现并非总是这样。 逻辑操作堆栈正在“损坏”。 我能想到的最好的解释是当“子”线程退出时将CallContext信息“合并”回“父”线程上下文导致“旧”子线程上下文信息(逻辑操作)为“inheritance“由另一个兄弟姐妹线程。 问题也可能与Parallel.For显然使用主线程(至少在示例代码中,如编写)作为“工作线程”之一(或者在并行域中应该调用它们)之间的事实有关。 每当执行DoLongRunningWork时,就会启动一个新的逻辑操作(在开始时)并停止(在结束时)(即,将其推送到LogicalOperationStack并从中弹出)。 如果主线程已经有效的逻辑操作,并且DoLongRunningWork在主线程上执行,则启动新的逻辑操作,因此主线程的LogicalOperationStack现在具有两个操作。 DoLongRunningWork的任何后续执行(只要DoLongRunningWork的这个“迭代”在主线程上执行)将(显然)inheritance主线程的LogicalOperationStack(现在它有两个操作,而不仅仅是一个预期的操作)。 我花了很长时间才弄清楚为什么LogicalOperationStack的行为在我的示例中与我的示例的修改版本不同。 最后,我看到在我的代码中,我在一个逻辑操作中将整个程序括起来,而在我的测试程序的修改版本中,我没有。 […]

我的流程在等待输入吗?

我正在使用Process类来运行exe。 exe是我无法控制的第三方控制台应用程序。 我想知道进程是否在命令行上等待输入。 如果它有任何区别,我打算在应用程序等待输入时终止它。 当程序的输出等待读取时,有适当的事件,但是当过程耐心地等待输入时,我看不到任何类似的事件。 ProcessStartInfo info = new ProcessStartInfo(); info.FileName = “myapp.exe”; info.CreateNoWindow = true; info.UseShellExecute = false; info.RedirectStandardError = true; info.RedirectStandardInput = true; info.RedirectStandardOutput = true; process.StartInfo = info; process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); 如何检测我的进程正在等待输入?

使用PerformanceCounter跟踪每个进程的内存和CPU使用情况?

如何使用System.Diagnostics.PerformanceCounter跟踪进程的内存和CPU使用情况?

为什么这个过程一启动就会崩溃?

我们有一个IIS WCF服务,它以另一个用户的身份启动另一个进程(app.exe)。 我完全控制了两个应用程序(现在这是一个开发环境)。 IIS应用程序池以我的身份运行,域用户(DOMAIN \ nirvin),也是该框的本地管理员。 第二个进程应该作为本地用户运行(svc-low)。 我正在使用System.Diagnostics.Process.Start(ProcessStartInfo)来启动该进程。 该过程成功启动 – 我知道因为没有抛出exception,我得到了一个进程ID。 但是进程立即死亡,我在事件日志中看到如下错误: 错误应用程序名称:app.exe,版本:1.0.3.0,时间戳:0x514cd763 错误模块名称:KERNELBASE.dll,版本:6.2.9200.16451,时间戳:0x50988aa6 exception代码:0xc06d007e 故障偏移:0x000000000003811c 错误进程id:0x10a4 错误应用程序启动时间:0x01ce274b3c83d62d 错误的应用程序路径:C:\ Program Files \ company \ app \ app.exe 错误模块路径:C:\ Windows \ system32 \ KERNELBASE.dll 报告ID:7a45cd1c-933e-11e2-93f8-005056b316dd 错误包全名: 错误包相关的应用程序ID: 我已经在app.exe(现在)中进行了非常彻底的日志记录,因此我认为它不会在.NET代码中引发错误(不再)。 这是真正令人讨厌的部分:我认为我只是启动了错误的进程,所以我在一个愚蠢的WinForms应用程序中复制了我的Process.Start()调用并在机器上像我一样运行它,希望能够修改,直到我得到正确的参数。 因此,当然这是第一次和每次都有效:我能够始终如一地启动第二个流程并使其按预期运行。 它只能从IIS启动,不起作用。 我试过给svc-low权限“以批处理作业登录”,并且我已尝试授予自己“替换进程级别令牌”(在本地安全策略中)的权限,但似乎都没有任何区别。 救命! 环境细节 Windows Server 2012 .NET 4.5(提到的所有应用程序) 额外细节 起初app.exe是一个控制台应用程序。 尝试启动是让conhost.exe在事件日志中生成错误,因此我将app.exe切换为Windows应用程序。 这让conhost脱离了这个等式,但让我了解了这里描述的情况。 (通过这个问题引导了这条道路。) 我使用的ProcessStartInfo对象如下所示: new […]