【发布时间】:2023-02-04 11:07:42
【问题描述】:
我正在尝试调试我的代码,并希望逐行跟踪我的代码的进展。
如何查看链表中的值和整数数组中的当前值?
我试过框架变量,但它只会给我内存位置。
(t_stack *) stack_a = 0x0000000100504080 stack_a
(int *) temp = 0x00000001005040e0
非常感谢你提前。
【问题讨论】:
-
让您的生活更轻松,使用 IDE,它将在幕后完成所有 gdb 的“魔法”
我正在尝试调试我的代码,并希望逐行跟踪我的代码的进展。
如何查看链表中的值和整数数组中的当前值?
我试过框架变量,但它只会给我内存位置。
(t_stack *) stack_a = 0x0000000100504080 stack_a
(int *) temp = 0x00000001005040e0
非常感谢你提前。
【问题讨论】:
这里提到了两种不同的场景。
在那种情况下,您必须告诉调试器它是一个数组以及有多少元素,因为它无法从type * 推断出这一点。在frame var 和expr 中,您可以使用--element-count(简称-Z)选项来做到这一点。还有一个方便的别名parray expr count。
这个你将不得不用手展开。调试器无法知道哪个成员是下一个元素指针,或者您的终止条件是什么。因此,您必须编写一些脚本来告诉 lldb 如何呈现该类型。
例如,如果链表的下一个指针称为next,终止条件为next == NULL,那么您可以这样做:
(lldb) script
>>> var = lldb.frame.FindVariable("LINKED_LIST_VARNAME")
>>> while 1:
... # Print out whatever you want here - print(var) is the easiest
... var = var.GetChildMemberWithName("next")
... if var.GetValueAsUnsigned() == 0:
... break
...
如果你经常这样做,那么你可以将其包装在“python 支持的 lldb 命令”中:
https://lldb.llvm.org/use/python-reference.html#create-a-new-lldb-command-using-a-python-function
它采用您要打印的变量的名称,并如上所述打印它。请记住,如果你做到这一点,不要使用我在这里使用的 lldb.frame 结构。相反,当您定义命令时,使用采用 SBExecutionContext 的签名,然后您可以从中获取当前帧。
【讨论】: