8

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?

genpfault
  • 51,148
  • 11
  • 85
  • 139
Coffee Maker
  • 1,543
  • 1
  • 16
  • 29
  • This is probably caused by sdl2main library. Normally it's not actually needed in normal sdl program, but it causes problems with debug output missing... – tp1 Dec 31 '15 at 00:05
  • @tp1 Were you suggesting that I delete sdl2main? The closest thing I found to that was `libSDL2main.a`, and deleting that file caused even more issues. – Coffee Maker Dec 31 '15 at 02:37
  • This could be something you're doing in SDL or a platform-related issue. I'm using SDL2 right now and have no issues printing via cout immediately during runtime. I'm also using MSYS2 on Windows. –  Dec 31 '15 at 02:45
  • This is not very definitive but might be helpful: http://www.gamedev.net/topic/299349-cout-to-console-in-sdl/ –  Dec 31 '15 at 02:50
  • I figured it out from some other site, so I'll go ahead and answer my own question. – Coffee Maker Dec 31 '15 at 03:05

4 Answers4

7

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.

Coffee Maker
  • 1,543
  • 1
  • 16
  • 29
5

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

Amnesia
  • 51
  • 1
  • 1
0

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).

Community
  • 1
  • 1
keltar
  • 17,711
  • 2
  • 37
  • 42
0

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.

Ming
  • 69
  • 8