Zapis do okna wyjściowego programu Visual Studio


605

Próbuję napisać komunikat do okna wyjściowego w celu debugowania. Szukałem funkcji takiej jak Java system.out.println(""). Próbowałem Debug.Write, Console.Writei Trace.Write. Nie wyświetla błędu, ale też niczego nie drukuje.

Opcje „Zdefiniuj stałą DEBUG” i „Zdefiniuj stałą TRACE” są zaznaczone.

Menu NarzędziaOpcjeDebugowanie„Przekierowanie cały tekst okna wyjściowego do Immediate Window” opcja nie jest zaznaczona.

Konfiguracja: Aktywna (debugowanie)

Uwaga: W razie potrzeby utworzyłem projekt za pomocą kreatora jako „Aplikacja Windows Forms”. Nie mam pojęcia, gdzie szukać.


32
spróbuj użyćDebug.WriteLine()
Nikson Kanti Paul

9
Ponieważ jest to starszy post, dodam to jako komentarz dla tych, którzy natkną się na pytanie. Zamiast faktycznie zmieniać kod, możesz także użyć specjalnych punktów przerwania zwanych tracepoints. Zobacz dokumentację MSDN
Wonko the Sane

13
Przypomnienie, że Debug.WriteLine () będzie działać tylko podczas uruchamiania w Debugowaniu. Oznacza to, że działa z F5, a nie CTRL-F5. Łatwo to przeoczyć.
kirk.burleson

3
To prawda, ale przydatnym narzędziem jest DebugView, który pokazuje wszystkie dane wyjściowe do strumienia debugowania, gdy działa poza debuggerem
the_mandrill

2
Jeśli próbujesz zapisać dane wyjściowe z testu jednostkowego uruchomionego w ramach testu Visual Studio, reguły są nieco inne, zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.
yoyo

Odpowiedzi:


754

Dodaj System.Diagnosticsprzestrzeń nazw, a następnie możesz użyć, Debug.WriteLine()aby szybko wydrukować wiadomość w oknie wyjściowym IDE. Aby uzyskać więcej informacji, zapoznaj się z tymi:


2
Dziękuję Ci. Zakładam, że nie ma sposobu, aby zapisać dane wyjściowe, jeśli zacznę bez debugowania (ctrl-f5), prawda?
previous_developer


Jeszcze raz dziękuję, ale to nie zadziałało. Śledzenie nie jest drukowane bez trybu debugowania, nawet jeśli zdefiniowano stałą TRACE.
previous_developer

Właśnie uruchomiłem tutaj małą aplikację, działa dobrze dla mnie. Być może w twoim otoczeniu jest mała usterka?
Bhargav Bhat

1
To jest mój kod testowy; pastebin.com/b7P0bYEa Jest to dość proste, ale wciąż nic. Spróbuję na innym systemie.
previous_developer

154

Spowoduje to zapisanie do okna wyników debugowania:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");

6
Dla mnie to „
wychodzi

Próbowałem tego na zestawie testów jednostkowych. Debugowałem wybrany test, ale nic nie próbowałem wydrukować w oknie debugowania.
Frank H.

To jednak wyświetla dane wyjściowe w oknie debugowania dopiero po zamknięciu strony internetowej. Chciałbym natychmiastowego wyświetlenia po uruchomieniu kodu. Poczekaj chwilę - zauważyłem, że okno wyjściowe jest ukryte podczas wykonywania kodu. Jeśli wyświetlę okno, moje wyjście jest tam.
Joe Cotton,

Czy możemy przechowywać dziennik tej wiadomości wydrukowany w oknie debugowania? lub czy Visual Studio zapewnia dostęp do dzienników okna debugowania?
Anmol Rathod,

82

Posługiwać się:

System.Diagnostics.Debug.WriteLine("your message here");

55
Debug.WriteLine

jest tym, czego szukasz.

Jeśli nie, spróbuj to zrobić:

Menu NarzędziaOpcjeDebugowanie → odznacz Wyślij natychmiastowe wyjście .


1
Być może Debug.Write () nie wstawia znaku powrotu karetki, więc wiadomości są buforowane?
Guy Starbuck

2
Nie widziałem Debug.WriteLine („String”), dopóki nie zrobiłem tego, co powiedział Micheasz. Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366,

3
Myślę, że w późniejszych wersjach pole wyboru to „Przekieruj cały tekst okna wyjściowego do okna bezpośredniego”
Houdini Sutherland,

6
w VS 2015 nazywa się to: „Przekieruj cały tekst okna wyjściowego do okna natychmiastowego”, na wszelki wypadek niektórzy musieli szukać 5 minut, aby znaleźć odpowiednie ustawienie :) - Przewijałem w górę i w dół, aby znaleźć opcję zaczynającą się od „ Wyślij ... ”:)
dba

22

Dla mnie działała tylko przestrzeń nazw Trace, a nie Debug:

System.Diagnostics.Trace.WriteLine("message");

Pracuję w projekcie C # w Visual Studio 2010.


2
Używam VS 2013 Professional i próbuję uzyskać dane wyjściowe z testu jednostkowego przy użyciu środowiska testów jednostkowych Visual Studio. Wygląda na to, że uprząż testowa przechwytuje i przekierowuje Debug.WriteLine, ale nie Trace.WriteLine. I nie zobaczysz danych wyjściowych śledzenia, chyba że debugujesz testy (nie tylko je uruchomisz).
yoyo

15

Być może szukasz

MessageBox.Show()

lub

Debug.Writeline()

8
MessageBox.Show()może być bardzo denerwujące, gdy chcesz zapisać wiele wartości do celów debugowania.
Demencja

4
Pytanie brzmiało: „Zapisywanie do okna wyjściowego programu Visual Studio?” nie do okna komunikatu.
Amir Touitou

@AmirTwito Okno komunikatu jest oknem wyjściowym.
ProfK,

4
Tak, prawda, ale pytanie brzmiało: „Zapisywanie do okna wyjściowego programu Visual Studio?” a nie do prostego okna komunikatu przy użyciu tego kodu: MessageBox.Show ()
Amir Touitou

4
@ProfK Okno wyjściowe Visual Studio jest bardzo specyficznym elementem GUI określonego programu i MessageBox.Shownie pisze do niego.
jpmc26,

9

Telefon

System.Diagnostics.Debug.WriteLine("message");

kończy się niepowodzeniem podczas pracy z .NET Core (V 1.0 lub 1.1).

Powinniśmy utworzyć i używać programu rejestrującego Microsoft.Extensions.Logging, ale ten dziennik pojawia się tylko w oknie podręcznym konsoli dotnet.exe, a nie w oknie Wyjście programu Visual Studio.


Debug.WriteLine (), Console.WriteLine () i Trace.WriteLine () nie generują niczego w Output dla .Net Core? Jakiś sposób na użycie jakiegoś prostego logowania bez konieczności pisania Logclass? Przeszukałem w Narzędzia> Opcje> Debugowanie i sprawdziłem „Pokaż dane wyjściowe z:” pod kątem możliwych rozwiązań.
Wouter Vanherck

4

Wymaga to frameworku strony trzeciej, a mianowicie Serilog , ale mimo to uważam, że jest to bardzo płynne doświadczenie z dostarczaniem wyników do miejsca, w którym mogę je zobaczyć.

Najpierw musisz zainstalować zlew Serilog's Trace . Po zainstalowaniu musisz skonfigurować rejestrator w następujący sposób:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

(Możesz ustawić inny minimalny poziom lub ustawić go na wartość konfiguracji lub dowolną z normalnych funkcji Serilog. Możesz także ustawić Tracerejestrator na konkretny poziom, aby zastąpić konfiguracje, lub jakkolwiek chcesz to zrobić.)

Następnie po prostu logujesz wiadomości normalnie i pojawiają się one w oknie Output:

Logger.Information("Did stuff!");

To nie wydaje się takie duże, więc pozwól mi wyjaśnić kilka dodatkowych zalet. Największe dla mnie było to, że mogłem jednocześnie logować się zarówno do okna Output, jak i do konsoli :

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

To dało mi wielką elastyczność w zakresie sposobu I spożywane wyjście, bez konieczności duplikowania wszystkie moje rozmowy do Console.Writez Debug.Write. Podczas pisania kodu mogłem uruchomić narzędzie wiersza polecenia w programie Visual Studio bez obawy utraty danych wyjściowych po ich wyjściu. Kiedy go wdrożyłem i musiałem coś debugować (i nie miałem programu Visual Studio), dane wyjściowe konsoli były łatwo dostępne do mojego użytku. Te same wiadomości mogą być również rejestrowane w pliku (lub dowolnym innym zlewie), gdy jest uruchomiony jako zaplanowane zadanie.

Najważniejsze jest to, że użycie Serilog do tego sprawiło, że bardzo łatwo było zrzucić wiadomości do wielu miejsc docelowych, dzięki czemu zawsze mogłem łatwo uzyskać dostęp do wyniku, niezależnie od tego, jak go uruchomiłem.

Wymaga również bardzo minimalnej konfiguracji i kodu.


1
Serilog ma teraz także „debugowanie” ujścia na github.com/serilog/serilog-sinks-debug, który działa w podobny sposób, ale ma nieco ładniejsze formatowanie :-) HTH!
Nicholas Blumhardt

Dlaczego nie upublicznić metody .net (może być statyczna) i umieścić tam wszystko, czego potrzebujesz, np. Console.Write lub Debug.Write itp. I używać jej wszędzie?
Saulius

@ Saulius "Te same wiadomości mogą być również rejestrowane w pliku (lub dowolnym innym zlewie), gdy jest uruchomiony jako zaplanowane zadanie. Najważniejsze jest to, że użycie Serilog do tego sprawiło, że bardzo łatwo było zrzucić wiadomości do wielu miejsca docelowe, dzięki czemu zawsze będę mieć łatwy dostęp do wyników, niezależnie od tego, jak je uruchomiłem.
jpmc26

1

To nie jest odpowiedź na pierwotne pytanie. Ale odkąd znalazłem to pytanie, kiedy szukałem sposobu interaktywnego zrzutu danych obiektowych, pomyślałem, że inni mogą odnieść korzyść ze wspomniania tej bardzo przydatnej alternatywy.

Ostatecznie skorzystałem z okna poleceń i wprowadziłem Debug.Printpolecenie, jak pokazano poniżej. Spowodowało to wydrukowanie obiektu pamięci w formacie, który można skopiować jako tekst, a to wszystko, czego naprawdę potrzebowałem.

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"


0

W Visual Studio 2015 dla mnie działało:

OutputDebugStringW(L"Write this to Output window in VS14.");

Przeczytaj dokumentację OutputDebugStringW tutaj .

wprowadź opis zdjęcia tutaj Pamiętaj, że ta metoda działa tylko wtedy, gdy debugujesz swój kod ( debug mode)


11
Czy to jest C ++? Pytanie jest oznaczone jako c # .
jpmc26,

0

Do celów debugowania System.Diagnostics.Debug.Writeline()polecenie nie zostanie wkompilowane w wersję wydania kodu, chyba że masz detektory debugowania. Zapisuje do wszystkich detektorów śledzenia, które zawierają okno wyjściowe VS podczas pracy w trybie debugowania.

W przypadku aplikacji konsoli. Console.Writeline()działałoby, ale dane wyjściowe nadal byłyby generowane w wydanej wersji pliku binarnego.

Wyniki debugowania powinny również pojawić się w normalnym oknie wyników podczas testów debugowania; podczas gdy dane wyjściowe console.writeline nie (ale można je znaleźć w oknie wyników testu).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.