2016-09-30 13 views
-1

Обычно я анализирую некоторый шестнадцатеричный дамп из журнала сбоев, этот шестнадцатеричный дамп относится к некоторой очень сложной структуре данных.Как преобразовать шестнадцатеричные данные в структуру данных в gdb

Поэтому я блуждаю, если gdb имеет некоторую удобную команду для перевода hexdump в структуру данных.

Например, у меня есть hexdump 0xAAABBCCDDEEFF, есть ли способ его преобразования в структуру данных?

, например:

p ((struct very_complcate_structure)(0xAABBCCDDEEFF)).u.flag.a 

Спасибо!

+0

Возможный дубликат [Использование gdb для декодирования шестнадцатеричных данных в struct] (http://stackoverflow.com/questions/39653514/using-gdb-to-decode-hex-data-to-struct) –

ответ

2

я получил некоторых из них шестнадцатеричного 0xAAABBCCDDEEFF

Хитрость заключается в том, чтобы получить эти значения в памяти запущенного процесса. Может быть полезно написать крошечную вспомогательную программу для этого.

Например, предположим, что у вас есть шестнадцатеричный дамп пакета, а удаленный сервер распечатал этот пакет, а затем разбился. (Обычный способ отладки это сделать удаленный дамп сервера core, а затем отладить его core - это позволит вам отлаживать гораздо больше проблем, чем то, что можно отлаживать, используя подход «ведения журнала», но я отвлекаюсь).

Так мы пишем вспомогательную программу, как это (с помощью this answer):

#include <string.h> 
#include <sstream> 
#include <iostream> 

#include "packet.h" // "complicated" packet structure defined here. 

int main(int argc, char *argv[]) { 
    struct packet pkt; 
    static const int num_ints = ((sizeof(pkt) + sizeof(int) - 1) & ~(sizeof(int) - 1))/sizeof(int); 

    for (int j = 1; j < argc; j++) { 
    memset(&pkt, 0, sizeof(pkt)); // start in clean state 

    // chop input string into 8-char chunks 
    std::string s = argv[j]; 
    for (int k = 0; k < num_ints && k < (s.size()/8) + 1 ; k++) { 
     std::stringstream ss; 
     ss << std::hex << s.substr(8 * k, 8); 

     unsigned int x; 
     ss >> x; 
     ((unsigned int *)&pkt)[k] = x; 
    } 
    std::cout << std::endl; // break here. 
    } 
} 

Теперь скомпилировать эту программу с g++ -g helper.cc -o helper, запустить его с

gdb -q ./helper AAABBCCDDEEFF.... 

Установить точку останова на строке 24 («обкатки здесь "), и используйте print pkt для проверки декодированного пакета.

+0

Спасибо за ваш комментарий, но в моем случае информация об отладке уже встроена, проблема состоит в том, что шестнадцатеричные данные поступают с удаленного сервера, чей хэш уже разбился и сбрасывает эти шестнадцатеричные значения. Мне нужно проанализировать шестнадцатеричные значения, чтобы получить полезную информацию, структура данных очень большая, поэтому я надеюсь, что gdb может помочь. – user14944

+0

@ user14944 Я обновил ответ. –

+0

Да, это блестящая идея. И я нашел другой подход - использовать расширение python gdb. Во всяком случае, мне нравится ваша идея, потому что я ненавижу python и предпочитаю писать код C. – user14944

 Смежные вопросы

  • Нет связанных вопросов^_^