OSDN Git Service

* fhandler.h (fhandler_base): Remove obsolete _rpos and _rsize elements.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / strace.cc
1 /* strace.cc: system/windows tracing
2
3    Copyright 1996, 1997, 1998, 1999, 2000 Cygnus Solutions.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #include "winsup.h"
12 #include <stdlib.h>
13 #include <time.h>
14 #include <wingdi.h>
15 #include <winuser.h>
16 #include <ctype.h>
17 #include "sync.h"
18 #include "sigproc.h"
19 #include "pinfo.h"
20
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); }
23
24 class strace NO_COPY strace;
25
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. */
28
29 #ifndef NOSTRACE
30
31 int
32 strace::microseconds()
33 {
34   static int first_microsec = 0;
35   static long long hires_frequency = 0;
36   static int hires_initted = 0;
37
38   int microsec;
39
40   if (!hires_initted)
41     {
42       hires_initted = 1;
43       QueryPerformanceFrequency ((LARGE_INTEGER *) &hires_frequency);
44       if (hires_frequency == 0)
45           hires_initted = 2;
46     }
47   if (hires_initted == 2)
48     {
49       int count = GetTickCount ();
50       microsec = count * 1000;
51     }
52   else
53     {
54       long long thiscount;
55       QueryPerformanceCounter ((LARGE_INTEGER *) &thiscount);
56       thiscount = (long long) (((double) thiscount/(double) hires_frequency)
57                                * 1000000.0);
58       microsec = thiscount;
59     }
60   if (first_microsec == 0)
61     first_microsec = microsec;
62   return microsec - first_microsec;
63 }
64
65 static int __stdcall
66 getfunc (char *in_dst, const char *func)
67 {
68   const char *p;
69   const char *pe;
70   char *dst = in_dst;
71   for (p = func; (pe = strchr (p, '(')); p = pe + 1)
72     if (isalnum ((int)pe[-1]) || pe[-1] == '_')
73       break;
74     else if (isspace((int)pe[-1]))
75       {
76         pe--;
77         break;
78       }
79   if (!pe)
80     pe = strchr (func, '\0');
81   for (p = pe; p > func; p--)
82     if (p != pe && *p == ' ')
83       {
84         p++;
85         break;
86       }
87   if (*p == '*')
88     p++;
89   while (p < pe)
90     *dst++ = *p++;
91
92   *dst++ = ':';
93   *dst++ = ' ';
94   *dst = '\0';
95
96   return dst - in_dst;
97 }
98
99 extern "C" char *__progname;
100
101 /* sprintf analog for use by output routines. */
102 int
103 strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
104 {
105   int count;
106   char fmt[80];
107   static int nonewline = FALSE;
108   DWORD err = GetLastError ();
109   const char *tn = threadname (0);
110   char *pn = __progname ?: myself->progname;
111
112   int microsec = microseconds ();
113   lmicrosec = microsec;
114
115   __small_sprintf (fmt, "%7d [%s] %s ", microsec, tn, "%s %d%s");
116
117   SetLastError (err);
118
119   if (nonewline)
120     count = 0;
121   else
122     {
123       char *p, progname[MAX_PATH + 1];
124       if ((p = strrchr (pn, '\\')) != NULL)
125         p++;
126       else if ((p = strrchr (pn, '/')) != NULL)
127         p++;
128       else
129         p = pn;
130       strcpy (progname, p);
131       if ((p = strrchr (progname, '.')) != NULL)
132         *p = '\000';
133       p = progname;
134       count = __small_sprintf (buf, fmt, p && *p ? p : "?",
135                                myself->pid, hExeced ? "!" : "");
136       if (func)
137         count += getfunc (buf + count, func);
138     }
139
140   count += __small_vsprintf (buf + count, infmt, ap);
141   char *p;
142   for (p = buf + count; p > buf; p--)
143     switch (p[-1])
144       {
145         case '\n':
146           p[-1] = '\0';
147           break;
148         case '\b':
149           *--p = '\0';
150            nonewline = TRUE;
151           goto done;
152         default:
153           goto addnl;
154       }
155
156 addnl:
157   *p++ = '\n';
158   *p = '\0';
159   nonewline = FALSE;
160
161 done:
162   return p - buf;
163 }
164
165 /* Write to strace file or strace queue. */
166 void
167 strace::write (unsigned category, const char *buf, int count)
168 {
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);
174   outstuff[-1] = ' ';
175   OutputDebugString (outbuf);
176 }
177
178 /* Printf function used when tracing system calls.
179    Warning: DO NOT SET ERRNO HERE! */
180
181 void
182 strace::prntf (unsigned category, const char *func, const char *fmt, ...)
183 {
184   DWORD err = GetLastError ();
185   int count;
186   char buf[10000];
187   va_list ap;
188
189   PROTECT(buf);
190   SetLastError (err);
191
192   va_start (ap, fmt);
193   count = this->vsprntf (buf, func, fmt, ap);
194   CHECK(buf);
195   if (category & _STRACE_SYSTEM)
196     {
197       DWORD done;
198       WriteFile (GetStdHandle (STD_ERROR_HANDLE), buf, count, &done, 0);
199       FlushFileBuffers (GetStdHandle (STD_ERROR_HANDLE));
200     }
201
202 #ifndef NOSTRACE
203   if (active)
204     this->write (category, buf, count);
205 #endif
206   SetLastError (err);
207 }
208
209 static const struct tab
210 {
211   int v;
212   const char *n;
213 }
214 ta[] =
215 {
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"  },
365   {  0, 0  }};
366
367 void
368 strace::wm (int message, int word, int lon)
369 {
370   if (active)
371     {
372       int i;
373
374       for (i = 0; ta[i].n; i++)
375         {
376           if (ta[i].v == message)
377             {
378               this->prntf (_STRACE_WM, NULL, "wndproc %d %s %d %d", message, ta[i].n, word, lon);
379               return;
380             }
381         }
382       this->prntf (_STRACE_WM, NULL, "wndproc %d unknown  %d %d", message, word, lon);
383     }
384 }
385 #endif /*NOSTRACE*/