Как заставить Debug.WriteLine работать с другими процессами? - PullRequest
1 голос
/ 05 сентября 2010

У меня есть программа, которая порождает два других процесса, используя System.Diagnostics.Process.Их вывод фиксируется первой программой:

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

Я пытаюсь отладить эти подпроцессы.Debug.WriteLine работает из основной программы, но не захватывается при вызове из подпроцессов.Как я могу заставить его работать?

Есть ли способ "перенаправить" это тоже?Или открыть окно вывода в VS для подпроцессов?

Ответы [ 2 ]

3 голосов
/ 05 сентября 2010

Вы можете захватить все выходные данные Debug.WriteLine из каждого процесса с помощью DbgView (http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx).

Вы также можете фильтровать / выделять по процессам, что может быть полезно.

На самом деле, это, вероятно, не отразит процесс, который на самом деле отлаживает 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

1 голос
/ 06 сентября 2010

Вы также можете добавить файл конфигурации в 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, а файл конфигурации должен быть помещен в ту же папку, что и исполняемый файл, чтобы его можно было получить.

Обратите внимание, что выводсозданный с помощью методов только в пространстве имен System.Diagnostics.Debug доступен в Debug build.Если вы хотите создавать сообщения трассировки также в Release сборке, вы можете использовать эквивалентный WriteLine метод из пространства имен System.Diagnostics.Trace.

Оба Trace.WriteLine и Debug.WriteLine фактически вызываюттот же метод Windows API под капотом: OutputDebugString.Вы также можете напрямую подключаться к выходу таких вызовов методов из вашего приложения .NET.В статье о CodeProject подробно описаны необходимые шаги:

DbMon.NET - Простой захват .NET OutputDebugString

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...