调试时检查映射的内容

Inspecting the content of a map while debugging

本文关键字:映射 检查 调试      更新时间:2023-10-16

为了调试,我需要查看映射(std::unordered_mapstd::map)的内容,Eclipse CDT调试器没有以可读的形式提供给我,例如{1: 2, 3:4, ...}

调试时检查映射内容的最佳方法是什么?

我是否必须重新使用打印语句进行调试?如果是,一个简洁的宏或函数会如何将任何映射的内容打印为字符串?

我必须回到打印语句的调试吗?如果是,一个简洁的宏或函数会如何将任何映射的内容打印为字符串?

我不知道你是否使用Eclipse,但打印地图很容易:

template <typename K, typename V>
std::ostream& operator<<(std::ostream& os, const std::map<K, V>& m)
{
os << "{ ";
for (typename std::map<K, V>::const_iterator i = m.begin(); i != m.end(); ++i)
{
if (i != m.begin()) os << ", ";
os << i->first << ": " << i->second;
}
return os << " }";
}

然后你就可以使用<< my_map了。不过,请注意,在大型代码库中,其他人可能也有同样的"聪明"想法,因此您可能希望将helper函数放在自己的命名空间中,或者为其命名一个更本地化的名称。周围的"{ "" }"", "分隔符的选择是任意的,可能不适合所有用户-有些用户可能想要自动字符串引用/转义等,所以在最好的情况下,将其放在全局命名空间中是可疑的,在这种情况下,它甚至可能被保留为可能包含在未来的C++标准或其他标准中-毕竟,它有点喜欢将自己的名字添加到std::命名空间中。如果您愿意,请查看标准。

GDB可以用Python扩展,并且有一个用于漂亮打印的API。

有很多漂亮的C++打印机可用,比如这个。