从 GDB 中的列表打印取消引用的值
Print dereferenced values from list in GDB
我正在查看 gdb 中的核心文件。我有一个 std::list 指向堆上对象的指针。使用 GDB 调试,打印列表 returns 地址列表。有道理。
我可以轻松打印列表中第一个元素的取消引用对象,即 'print *.my_list.front()'。我想查看列表中每个元素的内容。我无法打印每个取消引用的元素。有没有直接的方法来打印每个取消引用的元素?
我认为自己是一个 gdb 初学者,当我需要使用它时,通常会得过且过。我知道网上有导入 python 脚本的示例,尽管大多数示例显示的是调试 运行 程序。如果您还知道任何适合新手了解 gdb 最佳实践的好资源,我们将不胜感激。
gdb 对大多数标准库有 pretty-printers,因此在大多数情况下 print your_list
就足够了。但是,由于您有一个指针列表并且想要查看引用的对象,因此您必须获取列表中的一个元素,然后像您已经完成的那样使用 p *your_list.front()
来引用它。对于第一个元素之外的其他元素,您可以执行 p *(your_list.front()+1)
、p *(your_list.front()+2)
等。使用这样的指针运算,您可以在 取消引用之前获得另一个元素的地址 它。
您还可以将第一个元素视为数组的 开头 并在地址中使用 @SIZE
查看整个“数组”。这是 gdb 中的一种特殊语法,用于将内存区域视为 C 数组。假设您想查看列表中的前 4 个元素。您可以使用 p *your_list.front()@4
.
注意: 从核心文件或 运行 程序进行调试的主要区别是当您没有 运行 进程时您从核心文件进行调试。这意味着当您从核心文件进行调试时,您不能调用函数,除非在 gdb 中为您尝试调用的方法定义了 xmethod。 gdb 还已经定义了许多 xmethods,这就是为什么您可以在列表中调用 .front()
以及其他方法,例如 .size()
。
我正在查看 gdb 中的核心文件。我有一个 std::list 指向堆上对象的指针。使用 GDB 调试,打印列表 returns 地址列表。有道理。
我可以轻松打印列表中第一个元素的取消引用对象,即 'print *.my_list.front()'。我想查看列表中每个元素的内容。我无法打印每个取消引用的元素。有没有直接的方法来打印每个取消引用的元素?
我认为自己是一个 gdb 初学者,当我需要使用它时,通常会得过且过。我知道网上有导入 python 脚本的示例,尽管大多数示例显示的是调试 运行 程序。如果您还知道任何适合新手了解 gdb 最佳实践的好资源,我们将不胜感激。
gdb 对大多数标准库有 pretty-printers,因此在大多数情况下 print your_list
就足够了。但是,由于您有一个指针列表并且想要查看引用的对象,因此您必须获取列表中的一个元素,然后像您已经完成的那样使用 p *your_list.front()
来引用它。对于第一个元素之外的其他元素,您可以执行 p *(your_list.front()+1)
、p *(your_list.front()+2)
等。使用这样的指针运算,您可以在 取消引用之前获得另一个元素的地址 它。
您还可以将第一个元素视为数组的 开头 并在地址中使用 @SIZE
查看整个“数组”。这是 gdb 中的一种特殊语法,用于将内存区域视为 C 数组。假设您想查看列表中的前 4 个元素。您可以使用 p *your_list.front()@4
.
注意: 从核心文件或 运行 程序进行调试的主要区别是当您没有 运行 进程时您从核心文件进行调试。这意味着当您从核心文件进行调试时,您不能调用函数,除非在 gdb 中为您尝试调用的方法定义了 xmethod。 gdb 还已经定义了许多 xmethods,这就是为什么您可以在列表中调用 .front()
以及其他方法,例如 .size()
。