static void showInUI(ThreadsData* user_data, PDReader* reader, PDUI* uiFuncs) { PDReaderIterator it; ThreadsData* data = (ThreadsData*)user_data; if (PDRead_find_array(reader, &it, "threads", 0) == PDReadStatus_NotFound) return; uiFuncs->text(""); uiFuncs->columns(3, "threads", true); uiFuncs->text("Id"); uiFuncs->next_column(); uiFuncs->text("Name"); uiFuncs->next_column(); uiFuncs->text("Function"); uiFuncs->next_column(); int i = 0; PDVec2 size = { 0.0f, 0.0f }; data->setSelectedThread = false; int oldSelectedThread = data->selectedThread; while (PDRead_get_next_entry(reader, &it)) { uint64_t id; const char* name = ""; const char* function = ""; PDRead_find_u64(reader, &id, "id", it); PDRead_find_string(reader, &name, "name", it); PDRead_find_string(reader, &function, "function", it); char label[32]; sprintf(label, "%llx", id); if (uiFuncs->selectable(label, data->selectedThread == i, 1 << 1, size)) { data->selectedThread = i; data->threadId = (int)id; } uiFuncs->next_column(); uiFuncs->text(name); uiFuncs->next_column(); uiFuncs->text(function); uiFuncs->next_column(); i++; } if (oldSelectedThread != data->selectedThread) { data->setSelectedThread = true; } }
static void updateCallstack(CallstackData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_find_array(reader, &it, "callstack", 0) == PDReadStatus_NotFound) return; for (CallstackEntry& entry : data->callstack) { free((void*)entry.address); free((void*)entry.module); free((void*)entry.filename); } data->callstack.clear(); // TODO: Have a "spec" for the callstack to be used while (PDRead_get_next_entry(reader, &it)) { const char* filename = ""; const char* module = ""; char address[64] = { 0 }; uint32_t line = (uint32_t) ~0; CallstackEntry entry = { 0 }; getAddressString(address, reader, it); PDRead_find_string(reader, &filename, "filename", it); PDRead_find_string(reader, &module, "module_name", it); PDRead_find_u32(reader, &line, "line", it); entry.address = strdup(address); entry.line = -1; if (filename) { int fSep = findSeparator(filename); entry.filename = strdup(&filename[fSep]); } if (module) { int mSep = findSeparator(module); entry.module = strdup(&module[mSep]); } if (line != (uint32_t) ~0) entry.line = (int)line; data->callstack.push_back(entry); } }
static void updateRegisters(RegistersData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_find_array(reader, &it, "registers", 0) == PDReadStatus_NotFound) return; while (PDRead_get_next_entry(reader, &it)) { const char* name = ""; char registerValue[ValueSize]; PDRead_find_string(reader, &name, "name", it); getRegisterString(registerValue, reader, it); addOrUpdate(data, name, registerValue); } }
static void updateRegisters(DissassemblyData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_find_array(reader, &it, "registers", 0) == PDReadStatus_NotFound) return; while (PDRead_get_next_entry(reader, &it)) { const char* name = ""; PDRead_find_string(reader, &name, "name", it); if (!strcmp(name, "pc")) { PDRead_find_u64(reader, &data->pc, "register", it); } } }
static void setDisassemblyCode(DissassemblyData* data, PDReader* reader) { PDReaderIterator it; if (PDRead_find_array(reader, &it, "disassembly", 0) == PDReadStatus_NotFound) return; while (PDRead_get_next_entry(reader, &it)) { uint64_t address; const char* text; PDRead_find_u64(reader, &address, "address", it); PDRead_find_string(reader, &text, "line", it); insertLine(data, address, text); } }