blob: 58fcad3ef85f5b2312d36930fe5cde099913e626 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sw=8 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
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
Bram Moolenaar84a05ac2013-05-06 04:24:17 +020020 * tool all startup code will have completed before you can get the pid and
Bram Moolenaar071d4272004-06-13 20:20:40 +000021 * 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000030#include "vim.h"
31
32FILE *nb_debug = NULL;
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010033u_int nb_dlevel = 0; // nb_debug verbosity level
Bram Moolenaar071d4272004-06-13 20:20:40 +000034
Bram Moolenaar952d9d82021-08-02 18:07:18 +020035void nbdb(char *, ...) ATTRIBUTE_FORMAT_PRINTF(1, 2);
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
37static int lookup(char *);
Bram Moolenaar446cb832008-06-24 21:56:24 +000038#ifdef USE_NB_ERRORHANDLER
Bram Moolenaar071d4272004-06-13 20:20:40 +000039static int errorHandler(Display *, XErrorEvent *);
40#endif
41
42/*
43 * nbdebug_wait - This function can be used to delay or stop execution of vim.
Bram Moolenaar9af41842016-09-25 21:45:05 +020044 * It's normally used to delay startup while attaching a
Bram Moolenaarbb1969b2019-01-17 15:45:25 +010045 * debugger to a running process. Since NetBeans starts gvim
Bram Moolenaar071d4272004-06-13 20:20:40 +000046 * from a background process this is the only way to debug
47 * startup problems.
48 */
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010049 void
50nbdebug_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
Bram Moolenaar071d4272004-06-13 20:20:40 +000054{
55
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010056 init_homedir(); // not inited yet
Bram Moolenaar071d4272004-06-13 20:20:40 +000057#ifdef USE_WDDUMP
58 WDDump(0, 0, 0);
59#endif
60
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010061 // for debugging purposes only
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000062 if (wait_flags & WT_ENV && wait_var && getenv(wait_var) != NULL)
63 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000064 sleep(atoi(getenv(wait_var)));
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000065 }
66 else if (wait_flags & WT_WAIT && lookup("~/.gvimwait"))
67 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000068 sleep(wait_secs > 0 && wait_secs < 120 ? wait_secs : 20);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000069 }
70 else if (wait_flags & WT_STOP && lookup("~/.gvimstop"))
71 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000072 int w = 1;
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000073 while (w)
74 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000075 ;
76 }
77 }
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010078}
Bram Moolenaar071d4272004-06-13 20:20:40 +000079
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010080 void
Bram Moolenaar071d4272004-06-13 20:20:40 +000081nbdebug_log_init(
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010082 char *log_var, // env var with log file
83 char *level_var) // env var with nb_debug level
Bram Moolenaar071d4272004-06-13 20:20:40 +000084{
Bram Moolenaar6e0ce172019-12-05 20:12:41 +010085 char *file; // possible nb_debug output file
86 char *cp; // nb_dlevel pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +000087
Bram Moolenaar63d25552019-05-10 21:28:38 +020088 if (log_var && (file = getenv(log_var)) != NULL)
89 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000090 time_t now;
91
92 nb_debug = fopen(file, "a");
93 time(&now);
Bram Moolenaar63d25552019-05-10 21:28:38 +020094 fprintf(nb_debug, "%s", get_ctime(now, TRUE));
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000095 if (level_var && (cp = getenv(level_var)) != NULL)
96 {
Bram Moolenaar071d4272004-06-13 20:20:40 +000097 nb_dlevel = strtoul(cp, NULL, 0);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +000098 }
99 else
100 {
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100101 nb_dlevel = NB_TRACE; // default level
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102 }
Bram Moolenaar446cb832008-06-24 21:56:24 +0000103#ifdef USE_NB_ERRORHANDLER
104 XSetErrorHandler(errorHandler);
105#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106 }
107
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100108}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100110 void
111nbdbg(char *fmt, ...)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112{
113 va_list ap;
114
Bram Moolenaarebfec1c2023-01-22 21:14:53 +0000115 if (nb_debug != NULL && nb_dlevel & NB_TRACE)
116 {
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117 va_start(ap, fmt);
118 vfprintf(nb_debug, fmt, ap);
119 va_end(ap);
120 fflush(nb_debug);
121 }
122
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100123}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100125 static int
126lookup(char *file)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127{
128 char buf[BUFSIZ];
129
130 expand_env((char_u *) file, (char_u *) buf, BUFSIZ);
131 return
Bram Moolenaar4f974752019-02-17 17:44:42 +0100132#ifndef FEAT_GUI_MSWIN
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133 (access(buf, F_OK) == 0);
134#else
135 (access(buf, 0) == 0);
136#endif
137
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100138}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139
Bram Moolenaar446cb832008-06-24 21:56:24 +0000140#ifdef USE_NB_ERRORHANDLER
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100141 static int
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142errorHandler(
143 Display *dpy,
144 XErrorEvent *err)
145{
146 char msg[256];
147 char buf[256];
148
149 XGetErrorText(dpy, err->error_code, msg, sizeof(msg));
150 nbdbg("\n\nNBDEBUG Vim: X Error of failed request: %s\n", msg);
151
152 sprintf(buf, "%d", err->request_code);
153 XGetErrorDatabaseText(dpy,
154 "XRequest", buf, "Unknown", msg, sizeof(msg));
155 nbdbg("\tMajor opcode of failed request: %d (%s)\n",
156 err->request_code, msg);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +0000157 if (err->request_code > 128)
158 {
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159 nbdbg("\tMinor opcode of failed request: %d\n",
160 err->minor_code);
161 }
162
163 return 0;
164}
165#endif
166
167
Bram Moolenaar6e0ce172019-12-05 20:12:41 +0100168#endif // NBDEBUG