Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

371 lines
16 KiB

  1. //---------------------------------------------------------------------------
  2. // File: TraceTest
  3. //
  4. // A Test Program for using the ETW Trace Listener
  5. //
  6. // Author: Melur Raghuraman
  7. // Date: 01 Oct 2001
  8. //---------------------------------------------------------------------------
  9. using System;
  10. using System.Threading;
  11. using System.Diagnostics;
  12. using System.IO;
  13. using System.Data;
  14. using System.Configuration;
  15. using Microsoft.Win32.Diagnostics;
  16. using System.Reflection;
  17. /// <summary>
  18. /// Summary description for TraceTest.
  19. /// </summary>
  20. ///
  21. class TraceTest
  22. //TraceTest
  23. {
  24. //
  25. // This routine is a sample of what a performance and capacity planning trace
  26. // provider will do to generate ETW traces.
  27. //
  28. static void PerfTracingSample(int eventCount, int argCount, bool bString)
  29. {
  30. uint i;
  31. uint Status;
  32. Int64 AvgTime;
  33. int arg1 = 3276;
  34. int arg2 = 56797;
  35. Guid TransactionGuid = new Guid("{b4955bf0-3af1-4740-b475-99055d3fe9aa}");
  36. Console.WriteLine("Perf Tracing Sample running");
  37. TimerTest MyTimer = new TimerTest();
  38. WinTraceProvider MyProvider = new WinTraceProvider (new Guid("{98bea4af-ef37-424a-b457-9ea1cfd77dd9}") );
  39. MyTimer.Start();
  40. for (i=0; i < eventCount; i++)
  41. {
  42. if (MyProvider.enabled)
  43. {
  44. if (!bString)
  45. {
  46. switch (argCount)
  47. {
  48. case 0: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start); break;
  49. case 1: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1); break;
  50. case 2: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2); break;
  51. case 3: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1); break;
  52. case 4: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2); break;
  53. case 5: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1); break;
  54. case 6: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2); break;
  55. case 7: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2, arg1); break;
  56. case 8: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2, arg1, arg1); break;
  57. }
  58. }
  59. else
  60. {
  61. switch (argCount)
  62. {
  63. case 0: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start); break;
  64. case 1: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012"); break;
  65. case 2: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  66. case 3: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  67. case 4: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  68. case 5: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  69. case 6: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  70. case 7: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break;
  71. case 8: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012","12345678901234567890123456789012"); break;
  72. }
  73. }
  74. }
  75. }
  76. MyTimer.Stop();
  77. AvgTime = MyTimer.Average() / eventCount;
  78. Console.WriteLine("Start {0} End {1} Count {2} Delta {3} Freq {4}", MyTimer.m_Start, MyTimer.m_End, MyTimer.m_Count, MyTimer.m_Sum, MyTimer.m_Freq);
  79. AvgTime = MyTimer.m_Sum / MyTimer.m_Freq; // This is in seconds
  80. Console.WriteLine("Elapsed Time {0} milli seconds ", AvgTime*1000);
  81. // Assumes you are running on a 1700 MHz box.
  82. AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount);
  83. AvgTime = AvgTime / MyTimer.m_Freq;
  84. Console.WriteLine("Done! Average Time for {0} calls = {1} Cycles", eventCount, AvgTime);
  85. }
  86. //
  87. // Here's what a debug trace provider will have to do to generate debug traces
  88. //
  89. static void DebugTracingSample(int eventCount, int argCount, bool bString)
  90. {
  91. uint i;
  92. int EventCount = eventCount;
  93. uint Status;
  94. long AvgTime;
  95. unsafe
  96. {
  97. /* Test to determine how characters are encoded in the String class */
  98. sbyte[] b ={ 0x64, 0x65, 0x66, 0x67 };
  99. fixed(sbyte* sbyteArray = b)
  100. {
  101. String s = new String(sbyteArray,0,4);
  102. Console.WriteLine("Test String = " + s + " Length = " + s.Length);
  103. int len = s.Length*2;
  104. fixed(char* cArray = s.ToCharArray())
  105. {
  106. byte* bArray = (byte*)cArray;
  107. for(int h = 0; h < len; h++)
  108. Console.WriteLine("[{0}]:{1}",h,bArray[h]);
  109. }
  110. }
  111. }
  112. Console.WriteLine("DebugTracing Sample Running");
  113. unsafe {Console.WriteLine("sizeof char = " + sizeof(char));}
  114. TimerTest MyTimer = new TimerTest();
  115. WinTraceProvider MyProvider = new WinTraceProvider (new Guid("{98bea4af-ef37-424a-b457-9ea1cfd77dd9}") );
  116. /*** scratch work - start ***/
  117. Assembly assembly;
  118. assembly = Assembly.GetAssembly(MyTimer.GetType());
  119. Console.WriteLine("Code base : " + assembly.CodeBase);
  120. /*** scratch work - end ***/
  121. string frmtstr = "Hello {0}";
  122. string frmtstr2 = "Arg0 = {0} Arg1 = {1}";
  123. string frmtstr3 = "Arg0 ={0} Arg1 = {1} Arg2 = {2}";
  124. bool bool_v=false;
  125. byte byte_v=(byte)99;
  126. sbyte sbyte_v = (sbyte)-114;
  127. short short_v = (short)-54;
  128. ushort ushort_v = (ushort)5000;
  129. int int_v = -654;
  130. uint uint_v = (uint)12345;
  131. long long_v = (long)-98765;
  132. ulong ulong_v = (ulong)1234567;
  133. string string_v = "Does it work [2]?";
  134. char char_v='G';
  135. decimal decimal_v=(decimal)200.876543243213D;
  136. object decimal_obj = decimal_v;
  137. double double_v=(double)3.00;
  138. float float_v=2.00F;
  139. //This is a string of length 128 bytes
  140. string testStr = "We began in earnest on Microsoft Windows 2000 in August 1996!!!!";
  141. //string testStr = "12345678"; //16 bytes in length
  142. //Yes, it is only a performance test and hence we do not need the actual formatting. Yet....
  143. string testFmtStr1="Test Message = {0}", testFmtStr2 = testFmtStr1+",{1}", testFmtStr3 = testFmtStr2+",{2}";
  144. string testFmtStr4=testFmtStr3+",{3}", testFmtStr5=testFmtStr4+",{4}",testFmtStr6=testFmtStr5+",{5}";
  145. string testFmtStr7=testFmtStr6+",{6}", testFmtStr8=testFmtStr7+",{7}";
  146. Console.WriteLine("Length = " + testStr.Length);
  147. string emptyString = "";
  148. Console.WriteLine("Length of empty string = "+emptyString.Length);
  149. //Console.WriteLine(String.Format("Dummy Format {0} {1}","Hello"));
  150. unsafe{Console.WriteLine("size of decimal = " + sizeof(decimal));}
  151. Console.WriteLine("Length of decimal string = " + decimal_obj.ToString().Length);
  152. if (bString)
  153. {
  154. //Gather performance results for logging a message containing 1 128-byte argument.
  155. Console.WriteLine("Helooooo {0} {1} {2}",decimal_v,(object)null,decimal_v);
  156. //MyProvider.DoTraceMessage(1,"Helloooo {0} {1} {2}",decimal_v,(object)null,decimal_v);
  157. MyTimer.Start();
  158. for(i=0; i < eventCount; i++)
  159. {
  160. if (MyProvider.enabled)
  161. {
  162. switch(argCount)
  163. {
  164. case 1:MyProvider.DoTraceMessage(1,testFmtStr1,testStr);break;
  165. case 2:MyProvider.DoTraceMessage(1,testFmtStr2,testStr,testStr);break;
  166. case 3:MyProvider.DoTraceMessage(1,testFmtStr3,testStr,testStr,testStr);break;
  167. case 4:MyProvider.DoTraceMessage(1,testFmtStr4,testStr,testStr,testStr,testStr);break;
  168. case 5:MyProvider.DoTraceMessage(1,testFmtStr5,testStr,testStr,testStr,testStr, testStr);break;
  169. case 6:MyProvider.DoTraceMessage(1,testFmtStr6,testStr,testStr,testStr,testStr, testStr, testStr);break;
  170. case 7:MyProvider.DoTraceMessage(1,testFmtStr7,testStr,testStr,testStr,testStr, testStr, testStr, testStr);break;
  171. case 8:MyProvider.DoTraceMessage(1,testFmtStr8,testStr,testStr,testStr,testStr, testStr, testStr, testStr, testStr);break;
  172. }
  173. }
  174. }
  175. MyTimer.Stop();
  176. }
  177. else
  178. {
  179. MyTimer.Start();
  180. MyProvider.DoTraceMessage(1,frmtstr,bool_v);
  181. MyProvider.DoTraceMessage(1,frmtstr,byte_v);
  182. MyProvider.DoTraceMessage(1,frmtstr,sbyte_v);
  183. MyProvider.DoTraceMessage(1,frmtstr,short_v);
  184. MyProvider.DoTraceMessage(1,frmtstr,ushort_v);
  185. MyProvider.DoTraceMessage(1,frmtstr,int_v);
  186. MyProvider.DoTraceMessage(1,frmtstr,uint_v);
  187. MyProvider.DoTraceMessage(1,frmtstr,long_v);
  188. MyProvider.DoTraceMessage(1,frmtstr,ulong_v);
  189. MyProvider.DoTraceMessage(1,frmtstr,float_v);
  190. MyProvider.DoTraceMessage(1,frmtstr,double_v);
  191. MyProvider.DoTraceMessage(1,frmtstr,decimal_v);
  192. MyProvider.DoTraceMessage(1,frmtstr,char_v);
  193. MyProvider.DoTraceMessage(1,frmtstr,string_v);
  194. MyProvider.DoTraceMessage(1,frmtstr2,uint_v,byte_v);
  195. Status = MyProvider.DoTraceMessage(1,frmtstr3,decimal_v,float_v,long_v);
  196. /*
  197. for (i=0; i < eventCount; i++)
  198. {
  199. if (MyProvider.enabled)
  200. {
  201. for(i=0; i < eventCount; i++)
  202. {
  203. if (MyProvider.enabled)
  204. {
  205. switch(argCount)
  206. {
  207. case 1:MyProvider.DoTraceMessage(1,testFmtStr1,decimal_v);break;
  208. case 2:MyProvider.DoTraceMessage(1,testFmtStr2,decimal_v,decimal_v);break;
  209. case 3:MyProvider.DoTraceMessage(1,testFmtStr3,decimal_v,decimal_v,decimal_v);break;
  210. case 4:MyProvider.DoTraceMessage(1,testFmtStr4,decimal_v,decimal_v,decimal_v,decimal_v);break;
  211. case 5:MyProvider.DoTraceMessage(1,testFmtStr5,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v);break;
  212. case 6:MyProvider.DoTraceMessage(1,testFmtStr6,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v);break;
  213. case 7:MyProvider.DoTraceMessage(1,testFmtStr7,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v, decimal_v);break;
  214. case 8:MyProvider.DoTraceMessage(1,testFmtStr8,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v, decimal_v, decimal_v);break;
  215. }
  216. }
  217. }
  218. }
  219. }
  220. */
  221. MyTimer.Stop();
  222. /*
  223. AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount);
  224. AvgTime = AvgTime / MyTimer.m_Freq;
  225. Console.WriteLine("Encoding Scheme [{2} args] : Average Time for {0} calls = {1} Cycles", eventCount, AvgTime, argCount);
  226. MyTimer.Clear();
  227. MyTimer.Start();
  228. for (i=0; i < eventCount; i++)
  229. {
  230. if (MyProvider.enabled)
  231. {
  232. for(i=0; i < eventCount; i++)
  233. {
  234. if (MyProvider.enabled)
  235. {
  236. switch(argCount)
  237. {
  238. case 1:MyProvider.DoTraceMessage(1,testFmtStr1,((object)decimal_v).ToString());break;
  239. case 2:MyProvider.DoTraceMessage(1,testFmtStr2,((object)decimal_v).ToString(),((object)decimal_v).ToString());break;
  240. case 3:MyProvider.DoTraceMessage(1,testFmtStr3,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString());break;
  241. case 4:MyProvider.DoTraceMessage(1,testFmtStr4,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString());break;
  242. case 5:MyProvider.DoTraceMessage(1,testFmtStr5,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString());break;
  243. case 6:MyProvider.DoTraceMessage(1,testFmtStr6,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break;
  244. case 7:MyProvider.DoTraceMessage(1,testFmtStr7,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break;
  245. case 8:MyProvider.DoTraceMessage(1,testFmtStr8,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break;
  246. }
  247. }
  248. }
  249. }
  250. }
  251. MyTimer.Stop();
  252. AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount);
  253. AvgTime = AvgTime / MyTimer.m_Freq;
  254. Console.WriteLine("ToString() Scheme [{2} args] : Average Time for {0} calls = {1} Cycles", eventCount, AvgTime, argCount);
  255. */
  256. }
  257. Console.WriteLine("Debug Test Complete. Timing Results:");
  258. AvgTime = MyTimer.Average() / eventCount;
  259. Console.WriteLine("StartTime {0} EndTime {1} Count {2} Sum {3} Freq {4}", MyTimer.m_Start, MyTimer.m_End, eventCount, MyTimer.m_Sum, MyTimer.m_Freq);
  260. AvgTime = MyTimer.m_Sum / MyTimer.m_Freq; // This is in seconds
  261. AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount);
  262. AvgTime = AvgTime / MyTimer.m_Freq;
  263. Console.WriteLine("Done! Average Time for {0} calls = {1} Cycles", eventCount, AvgTime);
  264. }
  265. static void Main(string[] args)
  266. {
  267. uint i;
  268. int eventCount = 10000;
  269. int argCount = 0;
  270. bool testDebug=false;
  271. bool bString=false;
  272. try
  273. {
  274. i = 0;
  275. while (i < args.Length)
  276. {
  277. if (args[i] == "-Debug")
  278. {
  279. testDebug = true;
  280. }
  281. else if (args[i] == "-nArg")
  282. {
  283. i++;
  284. if (i >= args.Length) return;
  285. argCount = System.Convert.ToInt32(args[i]);
  286. }
  287. else if (args[i] == "-bString")
  288. {
  289. bString = true;
  290. }
  291. else
  292. {
  293. eventCount = 10000; //default
  294. eventCount = System.Convert.ToInt32(args[i]);
  295. }
  296. i++;
  297. }
  298. }
  299. catch (Exception e)
  300. {
  301. Console.WriteLine("{0} Exception caught.", e);
  302. Console.WriteLine("Usage: trace [EventCount] [-nArg argCount] [-bString] [-Debug]");
  303. return;
  304. }
  305. if (testDebug)
  306. {
  307. DebugTracingSample(eventCount, argCount, bString);
  308. }
  309. else
  310. {
  311. Console.WriteLine("PerfTracing with eventCount{0}, argCount {1}, bString {2}", eventCount, argCount, bString);
  312. PerfTracingSample(eventCount, argCount, bString);
  313. }
  314. return;
  315. }
  316. }