【问题标题】:How to get Debug.WriteLine to work with other processes?如何让 Debug.WriteLine 与其他进程一起工作?
【发布时间】:2010-09-06 04:24:42
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 DbgView (http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) 捕获每个进程的所有 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();
    

    见: http://msdn.microsoft.com/en-us/library/system.diagnostics.consoletracelistener.aspx

    【讨论】:

    • 请注意Debug.Xxx 方法以 DEBUG 符号为条件。因此,它们不会出现在发布版本中。 Trace.Xxx 方法并非如此,因此对于 OP,这可能是更合适的 API。
    • 哇,这是一个非常方便的程序。我很惊讶它开箱即用!
    • @Kent:啊!不知道DebugTrace 之间的区别,但是Debug 很好,因为这就是我正在做的;)
    • 请注意 Trace.xxxx 方法以 TRACE 符号为条件(这让我在快速命令行 CSC 编译中绊倒了)
    【解决方案2】:

    您还可以将配置文件添加到子进程的 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 构建中创建跟踪消息,则可以使用 System.Diagnostics.Trace 命名空间中的等效 WriteLine 方法。

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

    DbMon.NET - A simple .NET OutputDebugString capturer

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2023-02-02
      • 2021-08-20
      • 1970-01-01
      • 2017-06-25
      • 2020-12-13
      相关资源
      最近更新 更多