1 /* vi:set ts=8 sw=8 noet: 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 startup 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 37 static int lookup(char *); 38 #ifdef USE_NB_ERRORHANDLER 39 static int errorHandler(Display *, XErrorEvent *); 40 #endif 41 42 /* 43 * nbdebug_wait - This function can be used to delay or stop execution of vim. 44 * It's normally used to delay startup while attaching a 45 * debugger to a running process. Since NetBeans starts gvim 46 * from a background process this is the only way to debug 47 * startup problems. 48 */ 49 void 50 nbdebug_wait( 51 u_int wait_flags, // tells what to do 52 char *wait_var, // wait environment variable 53 u_int wait_secs) // how many seconds to wait 54 { 55 56 init_homedir(); // not inited yet 57 #ifdef USE_WDDUMP 58 WDDump(0, 0, 0); 59 #endif 60 61 // for debugging purposes only 62 if (wait_flags & WT_ENV && wait_var && getenv(wait_var) != NULL) { 63 sleep(atoi(getenv(wait_var))); 64 } else if (wait_flags & WT_WAIT && lookup("~/.gvimwait")) { 65 sleep(wait_secs > 0 && wait_secs < 120 ? wait_secs : 20); 66 } else if (wait_flags & WT_STOP && lookup("~/.gvimstop")) { 67 int w = 1; 68 while (w) { 69 ; 70 } 71 } 72 } 73 74 void 75 nbdebug_log_init( 76 char *log_var, // env var with log file 77 char *level_var) // env var with nb_debug level 78 { 79 char *file; // possible nb_debug output file 80 char *cp; // nb_dlevel pointer 81 82 if (log_var && (file = getenv(log_var)) != NULL) 83 { 84 time_t now; 85 86 nb_debug = fopen(file, "a"); 87 time(&now); 88 fprintf(nb_debug, "%s", get_ctime(now, TRUE)); 89 if (level_var && (cp = getenv(level_var)) != NULL) { 90 nb_dlevel = strtoul(cp, NULL, 0); 91 } else { 92 nb_dlevel = NB_TRACE; // default level 93 } 94 #ifdef USE_NB_ERRORHANDLER 95 XSetErrorHandler(errorHandler); 96 #endif 97 } 98 99 } 100 101 void 102 nbdbg(char *fmt, ...) 103 { 104 va_list ap; 105 106 if (nb_debug != NULL && nb_dlevel & NB_TRACE) { 107 va_start(ap, fmt); 108 vfprintf(nb_debug, fmt, ap); 109 va_end(ap); 110 fflush(nb_debug); 111 } 112 113 } 114 115 static int 116 lookup(char *file) 117 { 118 char buf[BUFSIZ]; 119 120 expand_env((char_u *) file, (char_u *) buf, BUFSIZ); 121 return 122 #ifndef FEAT_GUI_MSWIN 123 (access(buf, F_OK) == 0); 124 #else 125 (access(buf, 0) == 0); 126 #endif 127 128 } 129 130 #ifdef USE_NB_ERRORHANDLER 131 static int 132 errorHandler( 133 Display *dpy, 134 XErrorEvent *err) 135 { 136 char msg[256]; 137 char buf[256]; 138 139 XGetErrorText(dpy, err->error_code, msg, sizeof(msg)); 140 nbdbg("\n\nNBDEBUG Vim: X Error of failed request: %s\n", msg); 141 142 sprintf(buf, "%d", err->request_code); 143 XGetErrorDatabaseText(dpy, 144 "XRequest", buf, "Unknown", msg, sizeof(msg)); 145 nbdbg("\tMajor opcode of failed request: %d (%s)\n", 146 err->request_code, msg); 147 if (err->request_code > 128) { 148 nbdbg("\tMinor opcode of failed request: %d\n", 149 err->minor_code); 150 } 151 152 return 0; 153 } 154 #endif 155 156 157 #endif // NBDEBUG 158