首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在GDB中输出HashMap元素?

如何在GDB中输出HashMap元素?
EN

Stack Overflow用户
提问于 2021-01-27 19:23:03
回答 1查看 890关注 0票数 1

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

代码语言:javascript
运行
复制
(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}}
EN

Stack Overflow用户

回答已采纳

发布于 2021-01-28 03:56:10

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

例如,编译此程序:

代码语言:javascript
运行
复制
#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下运行它,结果是:

代码语言:javascript
运行
复制
(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++,以及on和on。

你的问题缺乏所有相关的细节。

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

更新:

容器略有损坏

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

--我想了解如何使用gdb脚本提取它。

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

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65925974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档