[英]How to get Debug.WriteLine to work with other processes?
我有一个使用System.Diagnostics.Process
生成另外两个进程的程序。 他们的输出由第一个程序捕获:
players[p.Key].StartInfo = new ProcessStartInfo
{
FileName = args[i],
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false
};
我正在尝试调试这些子过程。 Debug.WriteLine
在主程序中运行,但在从子进程内调用时不会捕获它。 我怎样才能让它发挥作用?
有没有办法“重定向”呢? 或者在VS中为子过程打开一个输出窗口?
您可以使用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
您还可以将配置文件添加到子进程的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构建中可用。 如果要在发布版本中创建跟踪消息,可以使用System.Diagnostics.Trace
命名空间中的等效WriteLine
方法。
Trace.WriteLine
和Debug.WriteLine
实际上都在引擎下调用相同的Windows API方法: OutputDebugString
。 您还可以直接从.NET应用程序全局附加到此类方法调用的输出。 CodeProject上的一篇文章详细描述了必要的步骤:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.