Пример #1
0
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;
    }
}
Пример #2
0
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);
    }
}