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

问题描述

我只有一个二进制文件一个coredump,我需要在程序崩溃时使用gdb脚本返回hashmap[8888][1]中向量元素的值。在程序运行时,容器被损坏,但据称可以获得必要的数据。问题是如何使用指针或其他东西来获得所需的向量并拉出我需要的元素?

(gdb) p hashmap
$1 = std::unordered_map with 5 elements
(gdb) ptype hashmap
type = std::unordered_map<int,std::vector<int>>
(gdb) p *(&hashmap - 2)
$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
$1 = 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++ 的版本,我们可以进一步猜测。

更新:

容器轻微损坏

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

我想了解如何使用 gdb 脚本将其拉出。

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

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