如何将十六进制数据转换为gdb中的数据结构

问题描述 投票:0回答:1

我通常会从崩溃日志中分析一些十六进制转储,这个十六进制转储属于一些非常复杂的数据结构。

所以我想知道 gdb 是否有一些方便的命令将十六进制转储转换为数据结构。

例如,我得到了一些十六进制转储

0xAAABBCCDDEEFF
,有没有办法将其转换回数据结构?

例如:

p ((struct very_complcate_structure)(0xAABBCCDDEEFF)).u.flag.a
c gdb coredump
1个回答
2
投票

我得到了一些十六进制转储 0xAAABBCCDDEEFF

诀窍是将这些值放入正在运行的进程的内存中。为此编写一个小帮助程序可能会很有用。

例如,假设您有一个数据包的十六进制转储,并且远程服务器打印了该数据包,然后崩溃了。 (调试此问题的常用方法是进行远程服务器转储

core
,然后调试该
core
——这将允许您调试比使用“日志记录”方法可能调试的更多问题,但我离题)。

所以我们编写一个像这样的帮助程序(使用这个答案):

#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
检查解码后的数据包。

© www.soinside.com 2019 - 2024. All rights reserved.