Coffee Maker
Coffee Maker

Reputation: 1573

How do I print to the console while an SDL 2 program is running?

I'd like to print some debugging stuff to the console while running my SDL 2 program, but it seems impossible. printf("Hi!\n") and SDL_Log("Hi!\n") both won't do me any good.

I even tried printing before initializing SDL (and after quitting it, too), but to no avail. It seems like merely importing the SDL library makes it impossible to print anything to the console.

Here are the parameters I'm compiling with, since it's possible that might have something to do with it:

g++ hello.cc -IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -std=c++11

Any ideas?

Upvotes: 8

Views: 12758

Answers (4)

Amnesia
Amnesia

Reputation: 61

Since this is still on going issue with SDL2 in window when using mingw, here is the better solution that I found and tested as working.

Do not remove the -mwindows build option as others have suggested. You should be adding `pkg-config --libs SDL2` as your build options but for the debug build options you should also add -mconsole at the end. It should come after the -mwindows flag.

Debug: `pkg-config --libs SDL2` -mconsole
Release: `pkg-config --libs SDL2`

Note: I'm compiling for Windows 10, SDL2 v2.0.9, Msys64, mingw64, Code::Blocks 17.12
`pkg-config --libs SDL2` expands to:
-LC:/msys64/mingw64/lib -lmingw32 -lSDL2main -lSDL2 -mwindows

References:
SDL2: keep the -mwindows flag in the pkg-config --libs output #2419
configure: force -mconsole when linking SDL under MinGW

Upvotes: 6

Ming
Ming

Reputation: 69

Since SDL2 use the windows subsystem, you can open the console window by using Win32 API.

According to this blog post:

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <windows.h>
#include <SDL2/SDL.h>

int main(int argc, char *argv[])
{
    // SDL2 init code...

    // Just before the event loop
    AllocConsole();

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    int hCrt = _open_osfhandle((long) handle_out, _O_TEXT);
    FILE* hf_out = _fdopen(hCrt, "w");
    setvbuf(hf_out, NULL, _IONBF, 1);
    *stdout = *hf_out;

    HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
    hCrt = _open_osfhandle((long) handle_in, _O_TEXT);
    FILE* hf_in = _fdopen(hCrt, "r");
    setvbuf(hf_in, NULL, _IONBF, 128);
    *stdin = *hf_in;

    // use the console just like a normal one - printf(), getchar(), ...
}

Hope this helps.

Upvotes: 0

keltar
keltar

Reputation: 18409

I use this approach for debugging console:

static ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
    ULONG_PTR pbi[6];
    ULONG ulSize = 0;
    LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
            PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); 
    *(FARPROC *)&NtQueryInformationProcess = 
        GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
    if(NtQueryInformationProcess){
        if(NtQueryInformationProcess(GetCurrentProcess(), 0,
                    &pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
            return pbi[5];
    }
    return (ULONG_PTR)-1;
}

static void _windows_init_console(int argc, char **argv) {
    (void)argc, (void)argv;
    ULONG_PTR ppid = GetParentProcessId();
    if(ppid == (ULONG_PTR)-1) {
        AllocConsole();
    } else {
        AttachConsole(ppid);
    }

    freopen("CONIN$", "r", stdin); 
    freopen("CONOUT$", "w", stdout); 
    freopen("CONOUT$", "w", stderr); 
}

(GetParentProcessId comes from How can a Win32 process get the pid of its parent?). Works quite fine, but I still cannot make it work with grep/findstr etc. (i.e. 'true' stdout with pipe redirection).

Upvotes: 0

Coffee Maker
Coffee Maker

Reputation: 1573

So, I figured out what's preventing me from seeing output. These compile options

-Wl,-subsystem,windows

essentially disable the console window, preventing output from being displayed. This is good for when a game is finished, but terrible for debugging. So, I went ahead and removed those compile options and now printf() and SDL_Log() work perfectly fine.

Upvotes: 7

Related Questions