Changeset 12713


Ignore:
Timestamp:
Aug 28, 2009, 5:32:00 PM (10 years ago)
Author:
palter
Message:

Pop up a console window when a GUI application on Windows goes
into the kernel debugger.

New Win32 executable with the above.

All my Windows boxes/VMs are 32-bit. Could someone build a 64-bit executable?

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/lisp-debug.c

    r12126 r12713  
    2828#include <stdio.h>
    2929
    30 #ifndef WINDOWS
     30#ifdef WINDOWS
     31#include <fcntl.h>
     32#else
    3133#include <sys/socket.h>
    3234#include <dlfcn.h>
     
    100102          (fd0stat.st_dev == devnullstat.st_dev));
    101103}
    102 
    103 #endif
     104#endif
     105
     106#ifdef WINDOWS
     107Boolean
     108stdin_is_dev_null()
     109{
     110  HANDLE stdIn;
     111  stdIn = GetStdHandle(STD_INPUT_HANDLE);
     112  return (stdIn == NULL);
     113}
     114#endif
     115
    104116
    105117char *
     
    145157    switch(c) {
    146158    case '\n':
     159      continue;
     160    case '\r':
    147161      continue;
    148162    case EOF:
     
    11081122#endif
    11091123
     1124#ifdef WINDOWS
     1125Boolean first_debugger_call = TRUE;
     1126#endif
     1127
    11101128
    11111129OSStatus
     
    11201138  debug_command_return state = debug_continue;
    11211139
     1140#ifdef WINDOWS
     1141  HANDLE h;
     1142  int fd;
     1143  FILE *f;
     1144
     1145  if (first_debugger_call) {
     1146    first_debugger_call = FALSE;
     1147    if (stdin_is_dev_null())
     1148      AllocConsole();
     1149    // Reassociate C's stdin with Windows' stdin
     1150    h = GetStdHandle(STD_INPUT_HANDLE);
     1151    fd = _open_osfhandle((intptr_t)h, _O_TEXT);
     1152    if (fd >= 0) {
     1153      f = _fdopen(fd, "r");
     1154      *stdin = *f;
     1155    }
     1156    // Reassociate C's stdout with Windows' stdout
     1157    h = GetStdHandle(STD_OUTPUT_HANDLE);
     1158    fd = _open_osfhandle((intptr_t)h, _O_TEXT);
     1159    if (fd >= 0) {
     1160      f = _fdopen(fd, "w");
     1161      *stdout = *f;
     1162    }
     1163    // Reassociate C's stderr with Windows' stderr
     1164    h = GetStdHandle(STD_ERROR_HANDLE);
     1165    fd = _open_osfhandle((intptr_t)h, _O_TEXT);
     1166    if (fd >= 0) {
     1167      f = _fdopen(fd, "w");
     1168      *stderr = *f;
     1169    }
     1170    dbgout = stderr;
     1171  }
     1172#endif
     1173
     1174  if (stdin_is_dev_null()) {
     1175    return -1;
     1176  }
     1177
    11221178  va_start(args,message);
    11231179  vfprintf(dbgout, message, args);
    11241180  fprintf(dbgout, "\n");
    11251181  va_end(args);
    1126  
    1127 
    1128 #ifndef WINDOWS
    1129   if (stdin_is_dev_null()) {
    1130     return -1;
    1131   }
    1132 #endif
     1182
    11331183  if (threads_initialized) {
    11341184    suspend_other_threads(false);
Note: See TracChangeset for help on using the changeset viewer.