C# 如何使Debug.WriteLine与其他进程一起工作?

C# 如何使Debug.WriteLine与其他进程一起工作?,c#,visual-studio,debugging,visual-studio-2010,C#,Visual Studio,Debugging,Visual Studio 2010,我有一个程序,它使用System.Diagnostics.Process生成另外两个进程。它们的输出由第一个程序捕获: players[p.Key].StartInfo = new ProcessStartInfo { FileName = args[i], RedirectStandardInput = true, RedirectStandardOu

我有一个程序,它使用System.Diagnostics.Process生成另外两个进程。它们的输出由第一个程序捕获:

            players[p.Key].StartInfo = new ProcessStartInfo
            {
                FileName = args[i],
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                UseShellExecute = false
            };
我正在尝试调试这些子进程。Debug.WriteLine可从主程序运行,但从子进程中调用时不会捕获它。我怎样才能让它工作


有没有一种方法可以改变方向?或者要在VS中为子进程打开一个输出窗口?

您可以使用DbgView捕获每个进程的所有Debug.WriteLine输出

您也可以按流程过滤/突出显示,这可能会有所帮助

实际上,这可能不会捕获VS实际调试的进程,因此您将在VS中获得顶级进程跟踪,在DbgView中获得其他进程,这可能会很好地解决问题

在开发期间或在丑陋的控制台窗口无关紧要的系统上,另一种可能有用的技术是将跟踪输出重定向到如下控制台:

Trace.Listeners.Add(new ConsoleTraceListener())
您可以通过调用AllocConsole向任何应用程序添加控制台,您需要通过向代码中添加以下声明来p/invoke:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll", SetLastError = true)]
static extern void AllocConsole();
见:

您可以使用DbgView捕获每个进程的所有Debug.WriteLine输出

您也可以按流程过滤/突出显示,这可能会有所帮助

实际上,这可能不会捕获VS实际调试的进程,因此您将在VS中获得顶级进程跟踪,在DbgView中获得其他进程,这可能会很好地解决问题

在开发期间或在丑陋的控制台窗口无关紧要的系统上,另一种可能有用的技术是将跟踪输出重定向到如下控制台:

Trace.Listeners.Add(new ConsoleTraceListener())
您可以通过调用AllocConsole向任何应用程序添加控制台,您需要通过向代码中添加以下声明来p/invoke:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll", SetLastError = true)]
static extern void AllocConsole();
见:

您还可以将配置文件添加到子进程的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命名空间中的方法创建的输出仅在调试生成中可用。如果还希望在发布版本中创建跟踪消息,可以使用System.Diagnostics.trace命名空间中的等效WriteLine方法

Trace.WriteLine和Debug.WriteLine实际上都在后台调用相同的Windows API方法:。您还可以从.NET应用程序直接全局附加到此类方法调用的输出。一篇关于CodeProject的文章详细介绍了必要的步骤:


您还可以将配置文件添加到子进程的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命名空间中的方法创建的输出仅在调试生成中可用。如果还希望在发布版本中创建跟踪消息,可以使用System.Diagnostics.trace命名空间中的等效WriteLine方法

Trace.WriteLine和Debug.WriteLine实际上都在后台调用相同的Windows API方法:。您还可以从.NET应用程序直接全局附加到此类方法调用的输出。一篇关于CodeProject的文章详细介绍了必要的步骤:


注意Debug.Xxx方法是以Debug符号为条件的。因此,它们不会出现在发布版本中。这对于Trace.Xxx方法是不正确的,所以对于OP.Wow来说,这可能是一个更合适的API,这是一个非常方便的程序。我很惊讶它竟然是这样开箱即用@肯特:啊!我不知道调试和跟踪之间的区别,但是调试很好,因为这就是我正在做的;注意Trace.xxxx方法是以Trace符号为条件的,而Trace符号正好让我在调试的快速命令行CSC编译器软件中出错。Xxx方法是以调试符号为条件的。因此,它们不会出现在发布版本中。这对于Trace.Xxx方法是不正确的,所以对于OP.Wow来说,这可能是一个更合适的API,这是一个非常方便的程序。我很惊讶它竟然是这样开箱即用@肯特:啊!我不知道调试和跟踪之间的区别,但是调试很好,因为这就是我正在做的;请注意,Trace.xxxx方法是以跟踪符号为条件的,在快速命令行CSC编译中,跟踪符号使我出错