/* * IO::Trace#run(stream = nil, formatter = nil) * * - Enables tracing * - Setup an MRI event hook for RUBY_EVENT_LINE * - yields the block * - Unregister event hook * - Stops tracing * - Snapshot collected aggregates * - Walk collected aggregates * - Dump results to a stream via a given formatter (both optional) * * Stream expects a #<<(data) and formatters a lambda{|stream, lambda| ... } contract */ static VALUE rb_io_trace_run(int argc, VALUE *argv, VALUE obj) { io_trace_t* trace = GetIOTracer(obj); VALUE formatter, result; int ret, status; result = Qnil; BlockRequired(); rb_scan_args(argc, argv, "02", &trace->stream, &trace->formatter); StartTrace(trace); #ifdef RUBY_VM rb_add_event_hook(rb_io_trace_event_hook, RUBY_EVENT_LINE, Qnil); #else rb_add_event_hook(rb_io_trace_event_hook, RUBY_EVENT_LINE); #endif result = rb_protect(rb_yield, obj, &status); rb_remove_event_hook(rb_io_trace_event_hook); StopTrace(trace); if(!NIL_P(trace->stream)){ formatter = rb_io_trace_formatter(trace); rb_funcall(formatter, id_call, 2, obj, trace->stream); } return result; }
int _tmain(int argc, _TCHAR* argv[]) { LPCWSTR sessionName = L"EtwSamples.Controller1"; const DWORD logFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES); const DWORD logFileNameLength = MAX_PATH; const DWORD loggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + (sizeof(WCHAR) * logFileNameLength); const DWORD loggerNameLength = 80; const DWORD size = sizeof(EVENT_TRACE_PROPERTIES) + (sizeof(WCHAR) * logFileNameLength) + (sizeof(WCHAR) * loggerNameLength); BYTE buffer[size] = {}; EVENT_TRACE_PROPERTIES * prop = reinterpret_cast<EVENT_TRACE_PROPERTIES *>(buffer); prop->Wnode.BufferSize = size; prop->Wnode.Flags = WNODE_FLAG_TRACED_GUID; prop->LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL | EVENT_TRACE_USE_PAGED_MEMORY; prop->LogFileNameOffset = logFileNameOffset; prop->LoggerNameOffset = loggerNameOffset; LPWSTR logFileName = reinterpret_cast<LPWSTR>(buffer + logFileNameOffset); LPWSTR loggerName = reinterpret_cast<LPWSTR>(buffer + loggerNameOffset); wcscpy_s(logFileName, logFileNameLength, L"Controller1.etl"); wcscpy_s(loggerName, loggerNameLength, sessionName); TRACEHANDLE traceHandle = INVALID_PROCESSTRACE_HANDLE; ULONG result = StartTrace(&traceHandle, sessionName, prop); result = EnableTraceEx(&PROVIDERID_SampleProvider0, NULL, traceHandle, 1, 0, 0, 0, 0, NULL); _putws(L"press any key to continue."); _getwch(); result = EnableTraceEx(&PROVIDERID_SampleProvider0, NULL, traceHandle, 0, 0, 0, 0, 0, NULL); result = StopTrace(traceHandle, NULL, prop); return 0; }