我有一个使用System.Diagnostics.Process
产生另外两个过程的程序。他们的输出由第一个程序捕获:
players[p.Key].StartInfo = new ProcessStartInfo
{
FileName = args[i],
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
我正在尝试调试这些子过程。 Debug.WriteLine
在主程序中起作用,但在从子程序中调用时不会捕获它。我怎样才能让它发挥作用?
有没有办法“重定向”呢?或者在VS中为子过程打开一个输出窗口?
答案 0 :(得分:3)
您可以使用DbgView(http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx)捕获每个进程的所有Debug.WriteLine输出。
您也可以按流程过滤/突出显示,这可能会有所帮助。
实际上,这可能无法捕获VS实际正在调试的进程,因此您将获得VS中的顶级进程跟踪以及DbgView中的其他进程,这可能会很好地解决。
在开发过程中(或在丑陋的控制台窗口无关紧要的系统上)另一个可能有用的技术是将跟踪输出重定向到这样的控制台:
Trace.Listeners.Add(new ConsoleTraceListener())
您可以通过调用AllocConsole()来向任何应用程序添加控制台,您需要通过在代码中添加以下声明来调用它:
using System.Runtime.InteropServices;
[DllImport("kernel32.dll", SetLastError = true)]
static extern void AllocConsole();
请参阅: http://msdn.microsoft.com/en-us/library/system.diagnostics.consoletracelistener.aspx
答案 1 :(得分:1)
您还可以将配置文件添加到子进程的exe文件中以创建TextWriterTraceListener
并将该exe的所有日志消息写入日志文件:
<configuration>
<system.diagnostics>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="TextListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.log" />
<remove name="Default" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
如果程序名为myapp.exe
,则配置文件的名称必须为myapp.exe.config
,并且配置文件需要与exe放在同一文件夹中才能被选中。
另请注意,使用System.Diagnostics.Debug
命名空间中的方法创建的输出仅在 Debug 构建中可用。如果您还想在 Release 版本中创建跟踪消息,则可以使用WriteLine
命名空间中的等效System.Diagnostics.Trace
方法。
Trace.WriteLine
和Debug.WriteLine
实际上都会在引擎盖下调用相同的Windows API方法:OutputDebugString
。您还可以直接从.NET应用程序全局附加到此类方法调用的输出。 CodeProject上的一篇文章详细描述了必要的步骤: