static void writeRegister(PDWriter* writer, const char* name, uint8_t size, uint16_t reg, uint8_t readOnly) { PDWrite_arrayEntryBegin(writer); PDWrite_string(writer, "name", name); PDWrite_u8(writer, "size", size); if (readOnly) PDWrite_u8(writer, "read_only", 1); if (size == 2) PDWrite_u16(writer, "register", reg); else PDWrite_u8(writer, "register", (uint8_t)reg); PDWrite_arrayEntryEnd(writer); }
static void setExceptionLocation(PDWriter* writer) { PDWrite_eventBegin(writer,PDEventType_setExceptionLocation); PDWrite_u16(writer, "address", pc); PDWrite_u8(writer, "address_size", 2); PDWrite_eventEnd(writer); }
static int update(void* userData, PDUI* uiFuncs, PDReader* inEvents, PDWriter* outEvents) { uint32_t event = 0; while ((event = PDRead_getEvent(inEvents)) != 0) { switch (event) { case PDEventType_setLocals: { showInUI((LocalsData*)userData, inEvents, uiFuncs); break; } } } // Request callstack data // TODO: Dont' request locals all the time PDWrite_eventBegin(outEvents, PDEventType_getLocals); PDWrite_u8(outEvents, "dummy_remove", 0); // TODO: Remove me PDWrite_eventEnd(outEvents); return 0; }
static void test_lldb(void** state) { (void)state; // we only do the LLDB test on Mac for now #ifdef __APPLE__ PluginData* pluginData; Session* session; int count = 0; assert_true(PluginHandler_addPlugin(OBJECT_DIR, "lldb_plugin")); assert_non_null(pluginData = PluginHandler_getBackendPlugins(&count)[0]); session = Session_createLocal((PDBackendPlugin*)pluginData->plugin, OBJECT_DIR "/crashing_native"); assert_non_null(session); // I hate to do this but there is really no good way to deal with this otherwise (at least currently) Time_sleepMs(800); Session_update(session); Session_update(session); // Expect that we have a crash here and thus are in PDDebugState_stopException state assert_int_equal(session->state, PDDebugState_StopException); // Request locals location. PDWriter* writer = session->currentWriter; PDReader* reader = session->reader; PDWrite_event_begin(writer, PDEventType_GetCallstack); PDWrite_u8(writer, "dummy", 0); PDWrite_event_end(writer); Session_update(session); PDBinaryWriter_finalize(session->currentWriter); PDBinaryReader_initStream(reader, PDBinaryWriter_getData(session->currentWriter), PDBinaryWriter_getSize(session->currentWriter)); uint32_t event; bool foundCallstack = false; while ((event = PDRead_get_event(reader)) != 0) { switch (event) { case PDEventType_SetCallstack: { foundCallstack = true; break; } } } assert_true(foundCallstack); #endif }
static void write_register(PDWriter* writer, const char* name, uint8_t size, uint16_t reg, uint8_t read_only) { PDWrite_array_entry_begin(writer); PDWrite_string(writer, "name", name); PDWrite_u8(writer, "size", size); if (read_only) { PDWrite_u8(writer, "read_only", 1); } if (size == 2) { PDWrite_u16(writer, "register", reg); } else { PDWrite_u8(writer, "register", (uint8_t)reg); } PDWrite_entry_end(writer); }
static void write_status_registers(PDWriter* writer, const char* name, uint16_t reg) { PDWrite_array_entry_begin(writer); PDWrite_string(writer, "name", name); PDWrite_u8(writer, "read_only", 1); char statusString[128] = { 0 }; sprintf(statusString, "0x$%2x N:%d V:%d -:%d B:%d D:%d I:%d Z:%d C:%d", reg, (reg >> 7) & 1, (reg >> 6) & 1, (reg >> 5) & 1, (reg >> 4) & 1, (reg >> 3) & 1, (reg >> 2) & 1, (reg >> 1) & 1, (reg >> 0) & 1); PDWrite_string(writer, "register_string", statusString); PDWrite_entry_end(writer); }
static int update(void* userData, PDUI* uiFuncs, PDReader* inEvents, PDWriter* outEvents) { ConsoleData* consoleData = (ConsoleData*)userData; uint32_t event = 0; (void)event; // test working build /*while ((event = PDRead_getEvent(inEvents)) != 0) { switch (event) { case PDEventType_setConsole: { //showInUI((ConsoleData*)userData, inEvents, uiFuncs); break; } } }*/ showInUI(consoleData, inEvents, uiFuncs); for (size_t i = 0; i < consoleData->scripts.size(); ++i) { PDWrite_eventBegin(outEvents, PDEventType_executeConsole); PDWrite_string(outEvents, "command", consoleData->scripts[i]); // TODO: Remove me PDWrite_eventEnd(outEvents); //free(consoleData->scripts[i]); } consoleData->scripts.clear(); // Request console data PDWrite_eventBegin(outEvents, PDEventType_getConsole); PDWrite_u8(outEvents, "dummy_remove", 0); // TODO: Remove me PDWrite_eventEnd(outEvents); return 0; }
static PDDebugState update(void* userData, PDAction action, PDReader* reader, PDWriter* writer) { PluginData* plugin = (PluginData*)userData; plugin->hasUpdatedRegistes = false; plugin->hasUpdatedExceptionLocation = false; onAction(plugin, action); processEvents(plugin, reader, writer); updateEvents(plugin, writer); if (plugin->hasUpdatedRegistes) { PDWrite_eventBegin(writer, PDEventType_setRegisters); PDWrite_arrayBegin(writer, "registers"); writeStatusRegister(writer, "flags", plugin->regs.flags); writeRegister(writer, "pc", 2, plugin->regs.pc, 1); writeRegister(writer, "sp", 1, plugin->regs.sp, 0); writeRegister(writer, "a", 1, plugin->regs.a, 0); writeRegister(writer, "x", 1, plugin->regs.x, 0); writeRegister(writer, "y", 1, plugin->regs.y, 0); PDWrite_arrayEnd(writer); PDWrite_eventEnd(writer); } if (plugin->hasUpdatedExceptionLocation) { PDWrite_eventBegin(writer, PDEventType_setExceptionLocation); PDWrite_u64(writer, "address", plugin->regs.pc); PDWrite_u8(writer, "address_size", 2); PDWrite_eventEnd(writer); } return plugin->state; }
static PDDebugState update(void* user_data, PDAction action, PDReader* reader, PDWriter* writer) { PluginData* plugin = (PluginData*)user_data; plugin->has_updated_registers = false; plugin->has_updated_exception_location = false; on_action(plugin, action); process_events(plugin, reader, writer); update_events(plugin); if (plugin->has_updated_registers) { log_debug("sending registens\n", ""); PDWrite_event_begin(writer, PDEventType_SetRegisters); PDWrite_array_begin(writer, "registers"); write_status_registers(writer, "flags", plugin->regs.flags); write_register(writer, "pc", 2, plugin->regs.pc, 1); write_register(writer, "sp", 1, plugin->regs.sp, 0); write_register(writer, "a", 1, plugin->regs.a, 0); write_register(writer, "x", 1, plugin->regs.x, 0); write_register(writer, "y", 1, plugin->regs.y, 0); PDWrite_array_end(writer); PDWrite_event_end(writer); } if (plugin->has_updated_exception_location) { PDWrite_event_begin(writer, PDEventType_SetExceptionLocation); PDWrite_u64(writer, "address", plugin->regs.pc); PDWrite_u8(writer, "address_size", 2); PDWrite_event_end(writer); } return plugin->state; }