如何在GDB中输出一个HashMap元素?

How to output a HashMap element in GDB?

我只有一个二进制文件和一个核心转储,我需要在程序崩溃时使用 gdb 脚本 return hashmap[8888][1] 中向量元素的值.虽然程序是运行,但容器已损坏,但声称可以获取必要的数据。问题是如何使用指针或其他东西到达所需的向量并提取我需要的元素?

(gdb) p hashmap
 = std::unordered_map with 5 elements
(gdb) ptype hashmap
type = std::unordered_map<int, std::vector<int>>
(gdb) p *(&hashmap - 2)
 = std::unordered_map with 94366596825088 elements = {[88888] = std::vector of length 3, capacity 3 = {1706628932, 1495493257, 18800028}, [8888] = std::vector of length 3, capacity 3 = {1254516933, 
    1257973910, 1938010846}, [888] = std::vector of length 3, capacity 3 = {1976864792, 130725599, 41716398}, [8] = std::vector of length 3, capacity 3 = {1533274456, 1112929722, 1834506749}, 
  [88] = std::vector of length 3, capacity 3 = {1297327512, 118122261, 1973236149}}

通常,print hashmap 应该会产生您需要的所有输出。

例如编译这个程序:

#include <unordered_map>
#include <vector>

int main(int arch, char *argv[])
{
  std::unordered_map<int, std::vector<int>> hm;
  hm[7777].push_back(42);
  hm[7777].push_back(24);
  hm[8888].push_back(42);
  return 0;
}

和 运行 它在 GDB 下的结果是:

(gdb) p hm
 = std::unordered_map with 2 elements = {[8888] = std::vector of length 1, capacity 1 = {42}, [7777] = std::vector of length 2, capacity 2 = {42, 24}}

我们可以在您的输出中看到 python 漂亮的打印机开始执行它的工作,但不知何故在句子中途失败了。

发生这种情况的原因有很多,从 gccgdb 的错误版本到错误安装 libstdc++,等等。

您的问题缺少所有相关细节。

首先,您应该尝试复制上述程序的输出。如果可行,请提供 GCC、GDB、libstdc++ 的版本,我们可以进一步猜测。

更新:

container is slightly corrupted

啊,这是标准漂亮打印机无法工作的另一个原因。

I want to understand how to pull it out using a gdb script.

在内存损坏的情况下,您将不得不在原始内存中卑躬屈膝,没有捷径(甚至不能保证数据存在)。

您必须阅读并理解 std::unordered_map 的实施细节。阅读它的漂亮打印机(通常安装到 /usr/share/gdb/python/gdb/libstdcxx/v6/printers.py)会有所帮助。