从GDB中的列表中打印取消引用的值



我正在查看gdb中的一个核心文件。我有一个指向堆上对象的指针的std::列表。使用GDB进行调试时,打印列表会返回地址列表。这是有道理的。

我可以很容易地打印列表中第一个元素的取消引用对象,即"print*$1.my_list.front(("。我想查看列表中每个元素的内容。我在打印每个取消引用的元素时遇到问题。有没有一种直接的方法来打印每个未引用的元素?

我认为自己是gdb的初学者,通常在需要使用它时会蒙混过关。我知道网上有导入python脚本的例子,尽管大多数例子都显示了调试正在运行的程序。如果您也知道有什么好的资源可以让新手了解更多关于gdb最佳实践的信息,我们将不胜感激。

gdb为大多数标准库提供了漂亮的打印机,因此在大多数情况下,仅print your_list就足够了。但是,由于您有一个指针列表,并且您想要查看被引用的对象,因此您必须获得列表中的一个元素,然后使用p *your_list.front()来尊重它,就像您已经做过的那样。对于除第一个元素之外的其他元素,您可以执行p *(your_list.front()+1)p *(your_list.front()+2)等。使用这样的指针算术,您可以在取消引用另一个元素之前获得其地址。

您还可以将第一个元素视为数组的开始;阵列";使用地址中的CCD_ 5。这是gdb中的一种特殊语法,将内存区域视为C数组。假设您想查看列表中的前4个元素。您可以使用p *your_list.front()@4


注意:从核心文件调试或从正在运行的程序调试的主要区别在于,从核心文件进行调试时没有正在运行的进程。这意味着您在从核心文件调试时不能调用函数,除非gdb中为您试图调用的方法定义了xmethod。gdb还定义了许多xmethods,这就是为什么您可以在列表中调用.front()以及其他方法(如.size()(。

最新更新