Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redirect Debug/Warning/... to OutputDebugString on Windows #79

Open
9 tasks
mosra opened this issue Nov 4, 2019 · 8 comments
Open
9 tasks

Redirect Debug/Warning/... to OutputDebugString on Windows #79

mosra opened this issue Nov 4, 2019 · 8 comments
Milestone

Comments

@mosra
Copy link
Owner

mosra commented Nov 4, 2019

When building a Win32 GUI app (CMake add_executable(... WIN32 ...), standard output isn't printed to the IDE output view, and one has to use OutputDebugString() because ... Windows is special! So we need to comply with that. Fortunately people learned to use Debug etc. quite extensively, Debug can have scoped output redirection, and there's now Corrade::Main that could do this automagically in the background.

Things to do:

Cc: @hsdk123

@mosra mosra added this to the 2019.1c milestone Nov 4, 2019
@hsdk123
Copy link

hsdk123 commented Nov 4, 2019

IsDebuggerPresent()

Currently testing in vs2019 - seems to work fine with RelWithDebInfo, and doesn't return true if no debugger attached.

@mosra
Copy link
Owner Author

mosra commented Nov 4, 2019

So it means ... if I run with F5, it says true, if I run with Ctrl-F5, it says false? In both cases I'd like the output to be shown.

@hsdk123
Copy link

hsdk123 commented Nov 4, 2019

if I run with F5, it says true, if I run with Ctrl-F5, it says false

Yup, I think that's exactly the case with IsDebuggerPresent() (you could of course do Ctrl-F5 and then reattach the debugger, but I don't think that's what you're implying..?)

@mosra
Copy link
Owner Author

mosra commented Nov 4, 2019

I thought I could use IsDebuggerPresent() to check if the app is being run from within Visual Studio. Because I imagine, if the app is run outside of the IDE, people would want the debug messages to be again in the standard output (or not?).

Well, Windows is not my native system, so I'm just guessing -- but I imagine everything sent to OutputDebugString is lost when you don't have the VS debugger attached? Or does it go somewhere else? System log?

@LB--
Copy link
Contributor

LB-- commented Jun 12, 2021

OutputDebugString isn't just for GUI apps, it works for console apps too. You can think of Windows apps as always having two different output streams - standard out and debug out - and one of them is only relevant while you have a debugger attached. Debugging-related messages should always go to OutputDebugString and normal input/output (such as piping between parent and child process) should be unaffected by it. Perhaps it should be configurable?

Repository owner deleted a comment from mgood7123 Jun 13, 2021
@williamjcm
Copy link
Contributor

williamjcm commented Jun 14, 2021

I tried here with MinGW-w64 GCC/GDB on Windows, using both CLion and the MSYS2 build of Qt Creator (I don't use VS because it can't be used with GCC and because it's really bloated).

IsDebuggerPresent() returns false when run normally through the IDE, and true when run with GDB attached. This happens both in Debug and Release (I don't use the other CMake build types).

Notes:

  • Qt Creator manages to grab the app's output anyway, I didn't need to do anything over there for some reason.
  • However, in CLion, I had to open its settings registry (the equivalent of Firefox' about:config screen), and switch run.processes.with.pty to false to see output when running an app normally (output when debugging worked out of the box).

@dween
Copy link

dween commented Feb 12, 2023

Note that you can just always send output to OutputDebugString and, when the application is running outside of Visual Studio, see it using the Sysinternals tool DebugView - see the download page. It was developed outside Microsoft but Microsoft acquired them. I've been using it for years - it's got some handy redirection and filtering capabilities, but you can also run it from the CMD CLI and redirect its output to a file.

@mosra
Copy link
Owner Author

mosra commented Feb 12, 2023

OutputDebugString() is apparently implemented via exceptions, so I imagine using it always could have some bad perf implications compared to the regular stdout.

OTOH, thanks to that tweet now I probably know how to catch it even without VS debugger or DebugView attached :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

No branches or pull requests

5 participants