如何解决从GDB中的列表中打印取消引用的值
我正在查看gdb中的核心文件。我有一个指向堆上对象的指针的std :: list列表。使用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)
等。使用这样的指针算法,您可以在取消引用之前获得另一个元素的地址。 / p>
您还可以将第一个元素视为数组的开始,并使用地址中的@SIZE
查看整个“数组”。这是gdb中的特殊语法,可以将内存区域视为C数组。假设您要查看列表中的前4个元素。您可以使用p *your_list.front()@4
。
注意:从核心文件或正在运行的程序进行调试的主要区别是,从核心文件进行调试时您没有正在运行的进程。这意味着从核心文件进行调试时无法调用函数,除非gdb中为要调用的方法定义了xmethod。 gdb还定义了许多xmethod,这就是为什么您可以调用.front()
以及列表中其他方法(例如.size()
)的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。