如何让Debug.WriteLine与其他进程一起使用?

时间:2010-09-05 19:51:05

标签: c# visual-studio debugging visual-studio-2010

我有一个使用System.Diagnostics.Process产生另外两个过程的程序。他们的输出由第一个程序捕获:

            players[p.Key].StartInfo = new ProcessStartInfo
            {
                FileName = args[i],
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false
            };

我正在尝试调试这些子过程。 Debug.WriteLine在主程序中起作用,但在从子程序中调用时不会捕获它。我怎样才能让它发挥作用?

有没有办法“重定向”呢?或者在VS中为子过程打开一个输出窗口?

2 个答案:

答案 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.WriteLineDebug.WriteLine实际上都会在引擎盖下调用相同的Windows API方法:OutputDebugString。您还可以直接从.NET应用程序全局附加到此类方法调用的输出。 CodeProject上的一篇文章详细描述了必要的步骤:

  

<强> DbMon.NET - A simple .NET OutputDebugString capturer