我只有一个二进制文件和一个coredump,在程序崩溃时,我需要使用gdb脚本返回hashmap8888中的向量元素的值。当程序运行时,容器被损坏,但据称可以获得必要的数据。问题是如何使用指针或其他东西到达所需的向量并提取我需要的元素?
(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}}
发布于 2021-01-28 03:56:10
通常,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漂亮的打印机开始做它的工作,但不知怎么失败了。
这可能是由于许多原因造成的,从gcc
或gdb
的坏版本到错误安装的libstdc++
,以及on和on。
你的问题缺乏所有相关的细节。
首先,您应该尝试复制上述程序的输出。如果这是可行的,供应版本的GCC,GDB,libstdc++,我们可以作出进一步的猜测。
更新:
容器略有损坏
啊,这也是标准的漂亮打印机不能工作的另一个原因。
--我想了解如何使用gdb脚本提取它。
在内存损坏的情况下,您将不得不在原始内存中卑躬屈膝,没有捷径(而且数据甚至不一定存在)。
您必须阅读和理解std::unordered_map
的实现细节。为它读取漂亮的打印机(通常安装在/usr/share/gdb/python/gdb/libstdcxx/v6/printers.py
上)会有帮助。
https://stackoverflow.com/questions/65925974
复制相似问题