1 /* strace.cc: system/windows tracing
3 Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
21 #define PROTECT(x) x[sizeof(x)-1] = 0
22 #define CHECK(x) if (x[sizeof(x)-1] != 0) { small_printf("array bound exceeded %d\n", __LINE__); ExitProcess(1); }
24 class strace NO_COPY strace;
26 /* 'twould be nice to declare this in winsup.h but winsup.h doesn't require
27 stdarg.h, so we declare it here instead. */
32 strace::microseconds()
34 static int first_microsec = 0;
35 static long long hires_frequency = 0;
36 static int hires_initted = 0;
43 QueryPerformanceFrequency ((LARGE_INTEGER *) &hires_frequency);
44 if (hires_frequency == 0)
47 if (hires_initted == 2)
49 int count = GetTickCount ();
50 microsec = count * 1000;
55 QueryPerformanceCounter ((LARGE_INTEGER *) &thiscount);
56 thiscount = (long long) (((double) thiscount/(double) hires_frequency)
60 if (first_microsec == 0)
61 first_microsec = microsec;
62 return microsec - first_microsec;
66 getfunc (char *in_dst, const char *func)
71 for (p = func; (pe = strchr (p, '(')); p = pe + 1)
72 if (isalnum ((int)pe[-1]) || pe[-1] == '_')
74 else if (isspace((int)pe[-1]))
80 pe = strchr (func, '\0');
81 for (p = pe; p > func; p--)
82 if (p != pe && *p == ' ')
99 extern "C" char *__progname;
101 /* sprintf analog for use by output routines. */
103 strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
107 static int nonewline = FALSE;
108 DWORD err = GetLastError ();
109 const char *tn = threadname (0);
110 char *pn = __progname ?: myself->progname;
112 int microsec = microseconds ();
113 lmicrosec = microsec;
115 __small_sprintf (fmt, "%7d [%s] %s ", microsec, tn, "%s %d%s");
123 char *p, progname[MAX_PATH + 1];
124 if ((p = strrchr (pn, '\\')) != NULL)
126 else if ((p = strrchr (pn, '/')) != NULL)
130 strcpy (progname, p);
131 if ((p = strrchr (progname, '.')) != NULL)
134 count = __small_sprintf (buf, fmt, p && *p ? p : "?",
135 myself->pid, hExeced ? "!" : "");
137 count += getfunc (buf + count, func);
140 count += __small_vsprintf (buf + count, infmt, ap);
142 for (p = buf + count; p > buf; p--)
165 /* Write to strace file or strace queue. */
167 strace::write (unsigned category, const char *buf, int count)
169 # define PREFIX (3 + 8 + 1 + 8 + 1)
170 char outbuf[PREFIX + 1 + count + 1];
171 # define outstuff (outbuf + 12)
172 __small_sprintf (outstuff, "%x %s", category, buf);
173 __small_sprintf (outbuf, "cYg%08x", strlen (outstuff) + 1);
175 OutputDebugString (outbuf);
178 /* Printf function used when tracing system calls.
179 Warning: DO NOT SET ERRNO HERE! */
182 strace::prntf (unsigned category, const char *func, const char *fmt, ...)
184 DWORD err = GetLastError ();
193 count = this->vsprntf (buf, func, fmt, ap);
195 if (category & _STRACE_SYSTEM)
198 WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, 0);
199 FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
204 this->write (category, buf, count);
209 static const struct tab
216 { WM_NULL, "WM_NULL" },
217 { WM_CREATE, "WM_CREATE" },
218 { WM_DESTROY, "WM_DESTROY" },
219 { WM_MOVE, "WM_MOVE" },
220 { WM_SIZE, "WM_SIZE" },
221 { WM_ACTIVATE, "WM_ACTIVATE" },
222 { WM_SETFOCUS, "WM_SETFOCUS" },
223 { WM_KILLFOCUS, "WM_KILLFOCUS" },
224 { WM_ENABLE, "WM_ENABLE" },
225 { WM_SETREDRAW, "WM_SETREDRAW" },
226 { WM_SETTEXT, "WM_SETTEXT" },
227 { WM_GETTEXT, "WM_GETTEXT" },
228 { WM_GETTEXTLENGTH, "WM_GETTEXTLENGTH" },
229 { WM_PAINT, "WM_PAINT" },
230 { WM_CLOSE, "WM_CLOSE" },
231 { WM_QUERYENDSESSION, "WM_QUERYENDSESSION" },
232 { WM_QUIT, "WM_QUIT" },
233 { WM_QUERYOPEN, "WM_QUERYOPEN" },
234 { WM_ERASEBKGND, "WM_ERASEBKGND" },
235 { WM_SYSCOLORCHANGE, "WM_SYSCOLORCHANGE" },
236 { WM_ENDSESSION, "WM_ENDSESSION" },
237 { WM_SHOWWINDOW, "WM_SHOWWINDOW" },
238 { WM_WININICHANGE, "WM_WININICHANGE" },
239 { WM_DEVMODECHANGE, "WM_DEVMODECHANGE" },
240 { WM_ACTIVATEAPP, "WM_ACTIVATEAPP" },
241 { WM_FONTCHANGE, "WM_FONTCHANGE" },
242 { WM_TIMECHANGE, "WM_TIMECHANGE" },
243 { WM_CANCELMODE, "WM_CANCELMODE" },
244 { WM_SETCURSOR, "WM_SETCURSOR" },
245 { WM_MOUSEACTIVATE, "WM_MOUSEACTIVATE" },
246 { WM_CHILDACTIVATE, "WM_CHILDACTIVATE" },
247 { WM_QUEUESYNC, "WM_QUEUESYNC" },
248 { WM_GETMINMAXINFO, "WM_GETMINMAXINFO" },
249 { WM_PAINTICON, "WM_PAINTICON" },
250 { WM_ICONERASEBKGND, "WM_ICONERASEBKGND" },
251 { WM_NEXTDLGCTL, "WM_NEXTDLGCTL" },
252 { WM_SPOOLERSTATUS, "WM_SPOOLERSTATUS" },
253 { WM_DRAWITEM, "WM_DRAWITEM" },
254 { WM_MEASUREITEM, "WM_MEASUREITEM" },
255 { WM_DELETEITEM, "WM_DELETEITEM" },
256 { WM_VKEYTOITEM, "WM_VKEYTOITEM" },
257 { WM_CHARTOITEM, "WM_CHARTOITEM" },
258 { WM_SETFONT, "WM_SETFONT" },
259 { WM_GETFONT, "WM_GETFONT" },
260 { WM_SETHOTKEY, "WM_SETHOTKEY" },
261 { WM_GETHOTKEY, "WM_GETHOTKEY" },
262 { WM_QUERYDRAGICON, "WM_QUERYDRAGICON" },
263 { WM_COMPAREITEM, "WM_COMPAREITEM" },
264 { WM_COMPACTING, "WM_COMPACTING" },
265 { WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING" },
266 { WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED" },
267 { WM_POWER, "WM_POWER" },
268 { WM_COPYDATA, "WM_COPYDATA" },
269 { WM_CANCELJOURNAL, "WM_CANCELJOURNAL" },
270 { WM_NCCREATE, "WM_NCCREATE" },
271 { WM_NCDESTROY, "WM_NCDESTROY" },
272 { WM_NCCALCSIZE, "WM_NCCALCSIZE" },
273 { WM_NCHITTEST, "WM_NCHITTEST" },
274 { WM_NCPAINT, "WM_NCPAINT" },
275 { WM_NCACTIVATE, "WM_NCACTIVATE" },
276 { WM_GETDLGCODE, "WM_GETDLGCODE" },
277 { WM_NCMOUSEMOVE, "WM_NCMOUSEMOVE" },
278 { WM_NCLBUTTONDOWN, "WM_NCLBUTTONDOWN" },
279 { WM_NCLBUTTONUP, "WM_NCLBUTTONUP" },
280 { WM_NCLBUTTONDBLCLK, "WM_NCLBUTTONDBLCLK" },
281 { WM_NCRBUTTONDOWN, "WM_NCRBUTTONDOWN" },
282 { WM_NCRBUTTONUP, "WM_NCRBUTTONUP" },
283 { WM_NCRBUTTONDBLCLK, "WM_NCRBUTTONDBLCLK" },
284 { WM_NCMBUTTONDOWN, "WM_NCMBUTTONDOWN" },
285 { WM_NCMBUTTONUP, "WM_NCMBUTTONUP" },
286 { WM_NCMBUTTONDBLCLK, "WM_NCMBUTTONDBLCLK" },
287 { WM_KEYFIRST, "WM_KEYFIRST" },
288 { WM_KEYDOWN, "WM_KEYDOWN" },
289 { WM_KEYUP, "WM_KEYUP" },
290 { WM_CHAR, "WM_CHAR" },
291 { WM_DEADCHAR, "WM_DEADCHAR" },
292 { WM_SYSKEYDOWN, "WM_SYSKEYDOWN" },
293 { WM_SYSKEYUP, "WM_SYSKEYUP" },
294 { WM_SYSCHAR, "WM_SYSCHAR" },
295 { WM_SYSDEADCHAR, "WM_SYSDEADCHAR" },
296 { WM_KEYLAST, "WM_KEYLAST" },
297 { WM_INITDIALOG, "WM_INITDIALOG" },
298 { WM_COMMAND, "WM_COMMAND" },
299 { WM_SYSCOMMAND, "WM_SYSCOMMAND" },
300 { WM_TIMER, "WM_TIMER" },
301 { WM_HSCROLL, "WM_HSCROLL" },
302 { WM_VSCROLL, "WM_VSCROLL" },
303 { WM_INITMENU, "WM_INITMENU" },
304 { WM_INITMENUPOPUP, "WM_INITMENUPOPUP" },
305 { WM_MENUSELECT, "WM_MENUSELECT" },
306 { WM_MENUCHAR, "WM_MENUCHAR" },
307 { WM_ENTERIDLE, "WM_ENTERIDLE" },
308 { WM_CTLCOLORMSGBOX, "WM_CTLCOLORMSGBOX" },
309 { WM_CTLCOLOREDIT, "WM_CTLCOLOREDIT" },
310 { WM_CTLCOLORLISTBOX, "WM_CTLCOLORLISTBOX" },
311 { WM_CTLCOLORBTN, "WM_CTLCOLORBTN" },
312 { WM_CTLCOLORDLG, "WM_CTLCOLORDLG" },
313 { WM_CTLCOLORSCROLLBAR, "WM_CTLCOLORSCROLLBAR" },
314 { WM_CTLCOLORSTATIC, "WM_CTLCOLORSTATIC" },
315 { WM_MOUSEFIRST, "WM_MOUSEFIRST" },
316 { WM_MOUSEMOVE, "WM_MOUSEMOVE" },
317 { WM_LBUTTONDOWN, "WM_LBUTTONDOWN" },
318 { WM_LBUTTONUP, "WM_LBUTTONUP" },
319 { WM_LBUTTONDBLCLK, "WM_LBUTTONDBLCLK" },
320 { WM_RBUTTONDOWN, "WM_RBUTTONDOWN" },
321 { WM_RBUTTONUP, "WM_RBUTTONUP" },
322 { WM_RBUTTONDBLCLK, "WM_RBUTTONDBLCLK" },
323 { WM_MBUTTONDOWN, "WM_MBUTTONDOWN" },
324 { WM_MBUTTONUP, "WM_MBUTTONUP" },
325 { WM_MBUTTONDBLCLK, "WM_MBUTTONDBLCLK" },
326 { WM_MOUSELAST, "WM_MOUSELAST" },
327 { WM_PARENTNOTIFY, "WM_PARENTNOTIFY" },
328 { WM_ENTERMENULOOP, "WM_ENTERMENULOOP" },
329 { WM_EXITMENULOOP, "WM_EXITMENULOOP" },
330 { WM_MDICREATE, "WM_MDICREATE" },
331 { WM_MDIDESTROY, "WM_MDIDESTROY" },
332 { WM_MDIACTIVATE, "WM_MDIACTIVATE" },
333 { WM_MDIRESTORE, "WM_MDIRESTORE" },
334 { WM_MDINEXT, "WM_MDINEXT" },
335 { WM_MDIMAXIMIZE, "WM_MDIMAXIMIZE" },
336 { WM_MDITILE, "WM_MDITILE" },
337 { WM_MDICASCADE, "WM_MDICASCADE" },
338 { WM_MDIICONARRANGE, "WM_MDIICONARRANGE" },
339 { WM_MDIGETACTIVE, "WM_MDIGETACTIVE" },
340 { WM_MDISETMENU, "WM_MDISETMENU" },
341 { WM_DROPFILES, "WM_DROPFILES" },
342 { WM_MDIREFRESHMENU, "WM_MDIREFRESHMENU" },
343 { WM_CUT, "WM_CUT" },
344 { WM_COPY, "WM_COPY" },
345 { WM_PASTE, "WM_PASTE" },
346 { WM_CLEAR, "WM_CLEAR" },
347 { WM_UNDO, "WM_UNDO" },
348 { WM_RENDERFORMAT, "WM_RENDERFORMAT" },
349 { WM_RENDERALLFORMATS, "WM_RENDERALLFORMATS" },
350 { WM_DESTROYCLIPBOARD, "WM_DESTROYCLIPBOARD" },
351 { WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD" },
352 { WM_PAINTCLIPBOARD, "WM_PAINTCLIPBOARD" },
353 { WM_VSCROLLCLIPBOARD, "WM_VSCROLLCLIPBOARD" },
354 { WM_SIZECLIPBOARD, "WM_SIZECLIPBOARD" },
355 { WM_ASKCBFORMATNAME, "WM_ASKCBFORMATNAME" },
356 { WM_CHANGECBCHAIN, "WM_CHANGECBCHAIN" },
357 { WM_HSCROLLCLIPBOARD, "WM_HSCROLLCLIPBOARD" },
358 { WM_QUERYNEWPALETTE, "WM_QUERYNEWPALETTE" },
359 { WM_PALETTEISCHANGING, "WM_PALETTEISCHANGING" },
360 { WM_PALETTECHANGED, "WM_PALETTECHANGED" },
361 { WM_HOTKEY, "WM_HOTKEY" },
362 { WM_PENWINFIRST, "WM_PENWINFIRST" },
363 { WM_PENWINLAST, "WM_PENWINLAST" },
364 { WM_ASYNCIO, "ASYNCIO" },
368 strace::wm (int message, int word, int lon)
374 for (i = 0; ta[i].n; i++)
376 if (ta[i].v == message)
378 this->prntf (_STRACE_WM, NULL, "wndproc %d %s %d %d", message, ta[i].n, word, lon);
382 this->prntf (_STRACE_WM, NULL, "wndproc %d unknown %d %d", message, word, lon);