如何将十六进制数据转换为gdb中的数据结构
How to convert hex data to a data structure in gdb
我通常从崩溃日志中分析一些十六进制转储,这个十六进制转储属于一些非常复杂的数据结构。
所以我想知道 gdb 是否有一些方便的命令来将 hexdump 转换为数据结构。
例如,我得到了一些hexdump 0xAAABBCCDDEEFF
,有没有办法将它转换回数据结构?
例如:
p ((struct very_complcate_structure)(0xAABBCCDDEEFF)).u.flag.a
谢谢!
I got some the hexdump 0xAAABBCCDDEEFF
诀窍是将这些值放入 运行ning 进程的内存中。为此编写一个小帮助程序可能会有用。
例如,假设您有一个数据包的十六进制转储,远程服务器打印出该数据包,然后崩溃。 (调试它的通常方法是制作远程服务器转储 core
,然后调试那个 core
-- 这将允许您调试比使用 [=28] 可能调试的问题更多的问题=] 方法,但我离题了)。
所以我们写了一个这样的辅助程序(使用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 行("break here" 行)设置断点,并使用 print pkt
检查解码的数据包。
我通常从崩溃日志中分析一些十六进制转储,这个十六进制转储属于一些非常复杂的数据结构。
所以我想知道 gdb 是否有一些方便的命令来将 hexdump 转换为数据结构。
例如,我得到了一些hexdump 0xAAABBCCDDEEFF
,有没有办法将它转换回数据结构?
例如:
p ((struct very_complcate_structure)(0xAABBCCDDEEFF)).u.flag.a
谢谢!
I got some the hexdump 0xAAABBCCDDEEFF
诀窍是将这些值放入 运行ning 进程的内存中。为此编写一个小帮助程序可能会有用。
例如,假设您有一个数据包的十六进制转储,远程服务器打印出该数据包,然后崩溃。 (调试它的通常方法是制作远程服务器转储 core
,然后调试那个 core
-- 这将允许您调试比使用 [=28] 可能调试的问题更多的问题=] 方法,但我离题了)。
所以我们写了一个这样的辅助程序(使用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 行("break here" 行)设置断点,并使用 print pkt
检查解码的数据包。