DR_EXPORT void dr_init(client_id_t id) { if (!drmgr_init()) CHECK(false, "init failed"); /* init buffer routines */ drx_init(); circular_fast = drx_buf_create_circular_buffer(DRX_BUF_FAST_CIRCULAR_BUFSZ); circular_slow = drx_buf_create_circular_buffer(CIRCULAR_SLOW_SZ); trace = drx_buf_create_trace_buffer(TRACE_SZ, verify_trace_buffer); CHECK(circular_fast != NULL, "circular fast failed"); CHECK(circular_slow != NULL, "circular slow failed"); CHECK(trace != NULL, "trace failed"); CHECK(drmgr_register_thread_init_event(event_thread_init), "event thread init failed"); /* register events */ dr_register_exit_event(event_exit); if (!drmgr_register_bb_instrumentation_event(event_app_analysis, event_app_instruction, NULL)) CHECK(false, "init failed"); }
DR_EXPORT void dr_client_main(client_id_t id, int argc, const char *argv[]) { drreg_options_t ops = { sizeof(ops), 4 /*max slots needed*/, false }; dr_set_client_name("DynamoRIO Sample Client 'memval'", "http://dynamorio.org/issues"); if (!drmgr_init() || !drutil_init() || !drx_init()) DR_ASSERT(false); if (drreg_init(&ops) != DRREG_SUCCESS) DR_ASSERT(false); /* register events */ dr_register_exit_event(event_exit); if (!drmgr_register_thread_init_event(event_thread_init) || !drmgr_register_thread_exit_event(event_thread_exit) || !drmgr_register_bb_app2app_event(event_bb_app2app, NULL) || !drmgr_register_bb_instrumentation_event(event_app_analysis, event_app_instruction, NULL)) DR_ASSERT(false); client_id = id; tls_idx = drmgr_register_tls_field(); trace_buffer = drx_buf_create_trace_buffer(MEM_BUF_SIZE, trace_fault); /* We could make this a trace buffer and specially handle faults, but it is not yet * worth the effort. */ write_buffer = drx_buf_create_circular_buffer(WRT_BUF_SIZE); DR_ASSERT(tls_idx != -1 && trace_buffer != NULL && write_buffer != NULL); /* make it easy to tell, by looking at log file, which client executed */ dr_log(NULL, DR_LOG_ALL, 1, "Client 'memval' initializing\n"); }