1 /* vi:set ts=8 sts=8 sw=8: 2 * 3 * VIM - Vi IMproved by Bram Moolenaar 4 * Visual Workshop integration by Gordon Prieur 5 * 6 * Do ":help uganda" in Vim to read copying and usage conditions. 7 * Do ":help credits" in Vim to see a list of people who contributed. 8 * See README.txt for an overview of the Vim source code. 9 */ 10 11 /* 12 * NetBeans Debugging Tools. What are these tools and why are they important? 13 * There are two main tools here. The first tool is a tool for delaying or 14 * stopping gvim during startup. The second tool is a protocol log tool. 15 * 16 * The startup delay tool is called nbdebug_wait(). This is very important for 17 * debugging startup problems because gvim will be started automatically from 18 * netbeans and cannot be run directly from a debugger. The only way to debug 19 * a gvim started by netbeans is by attaching a debugger to it. Without this 20 * tool all starup code will have completed before you can get the pid and 21 * attach. 22 * 23 * The second tool is a log tool. 24 * 25 * This code must have NBDEBUG defined for it to be compiled into vim/gvim. 26 */ 27 28 #ifdef NBDEBUG 29 30 #include "vim.h" 31 32 FILE *nb_debug = NULL; 33 u_int nb_dlevel = 0; /* nb_debug verbosity level */ 34 35 void nbdb(char *, ...); 36 void nbtrace(char *, ...); 37 38 static int lookup(char *); 39 #ifndef FEAT_GUI_W32 40 static int errorHandler(Display *, XErrorEvent *); 41 #endif 42 43 /* 44 * nbdebug_wait - This function can be used to delay or stop execution of vim. 45 * Its normally used to delay startup while attaching a 46 * debugger to a running process. Since workshop starts gvim 47 * from a background process this is the only way to debug 48 * startup problems. 49 */ 50 51 void nbdebug_wait( 52 u_int wait_flags, /* tells what to do */ 53 char *wait_var, /* wait environment variable */ 54 u_int wait_secs) /* how many seconds to wait */ 55 { 56 57 init_homedir(); /* not inited yet */ 58 #ifdef USE_WDDUMP 59 WDDump(0, 0, 0); 60 #endif 61 62 /* for debugging purposes only */ 63 if (wait_flags & WT_ENV && wait_var && getenv(wait_var) != NULL) { 64 sleep(atoi(getenv(wait_var))); 65 } else if (wait_flags & WT_WAIT && lookup("~/.gvimwait")) { 66 sleep(wait_secs > 0 && wait_secs < 120 ? wait_secs : 20); 67 } else if (wait_flags & WT_STOP && lookup("~/.gvimstop")) { 68 int w = 1; 69 while (w) { 70 ; 71 } 72 } 73 } /* end nbdebug_wait */ 74 75 76 void 77 nbdebug_log_init( 78 char *log_var, /* env var with log file */ 79 char *level_var) /* env var with nb_debug level */ 80 { 81 char *file; /* possible nb_debug output file */ 82 char *cp; /* nb_dlevel pointer */ 83 84 if (log_var && (file = getenv(log_var)) != NULL) { 85 time_t now; 86 87 nb_debug = fopen(file, "a"); 88 time(&now); 89 fprintf(nb_debug, "%s", asctime(localtime(&now))); 90 if (level_var && (cp = getenv(level_var)) != NULL) { 91 nb_dlevel = strtoul(cp, NULL, 0); 92 } else { 93 nb_dlevel = NB_TRACE; /* default level */ 94 } 95 } 96 97 } /* end nbdebug_log_init */ 98 99 100 101 102 void 103 nbtrace( 104 char *fmt, 105 ...) 106 { 107 va_list ap; 108 109 if (nb_debug!= NULL && (nb_dlevel & (NB_TRACE | NB_TRACE_VERBOSE))) { 110 va_start(ap, fmt); 111 vfprintf(nb_debug, fmt, ap); 112 va_end(ap); 113 fflush(nb_debug); 114 } 115 116 } /* end nbtrace */ 117 118 119 void 120 nbdbg( 121 char *fmt, 122 ...) 123 { 124 va_list ap; 125 126 if (nb_debug != NULL && nb_dlevel & NB_TRACE) { 127 va_start(ap, fmt); 128 vfprintf(nb_debug, fmt, ap); 129 va_end(ap); 130 fflush(nb_debug); 131 } 132 133 } /* end nbdbg */ 134 135 136 void 137 nbprt( 138 char *fmt, 139 ...) 140 { 141 va_list ap; 142 143 if (nb_debug != NULL && nb_dlevel & NB_PRINT) { 144 va_start(ap, fmt); 145 vfprintf(nb_debug, fmt, ap); 146 va_end(ap); 147 fflush(nb_debug); 148 } 149 150 } /* end nbprt */ 151 152 153 static int 154 lookup( 155 char *file) 156 { 157 char buf[BUFSIZ]; 158 159 expand_env((char_u *) file, (char_u *) buf, BUFSIZ); 160 return 161 #ifndef FEAT_GUI_W32 162 (access(buf, F_OK) == 0); 163 #else 164 (access(buf, 0) == 0); 165 #endif 166 167 } /* end lookup */ 168 169 #ifndef FEAT_GUI_W32 170 static int 171 errorHandler( 172 Display *dpy, 173 XErrorEvent *err) 174 { 175 char msg[256]; 176 char buf[256]; 177 178 XGetErrorText(dpy, err->error_code, msg, sizeof(msg)); 179 nbdbg("\n\nNBDEBUG Vim: X Error of failed request: %s\n", msg); 180 181 sprintf(buf, "%d", err->request_code); 182 XGetErrorDatabaseText(dpy, 183 "XRequest", buf, "Unknown", msg, sizeof(msg)); 184 nbdbg("\tMajor opcode of failed request: %d (%s)\n", 185 err->request_code, msg); 186 if (err->request_code > 128) { 187 nbdbg("\tMinor opcode of failed request: %d\n", 188 err->minor_code); 189 } 190 191 return 0; 192 } 193 #endif 194 195 196 #endif /* NBDEBUG */ 197