【问题标题】:In debugging with lldb: how do you access current variable values in a linked list?在使用 lldb 进行调试时:如何访问链表中的当前变量值?
【发布时间】:2023-02-04 11:07:42
【问题描述】:

我正在尝试调试我的代码,并希望逐行跟踪我的代码的进展。

如何查看链表中的值和整数数组中的当前值?
我试过框架变量,但它只会给我内存位置。

(t_stack *) stack_a = 0x0000000100504080 stack_a
(int *) temp = 0x00000001005040e0

非常感谢你提前。

【问题讨论】:

  • 让您的生活更轻松,使用 IDE,它将在幕后完成所有 gdb 的“魔法”

标签: c lldb


【解决方案1】:

这里提到了两种不同的场景。

  1. 一个指向内存区域的(类型*)指针,您知道它是指向该类型的 N 个元素的数组的指针。

    在那种情况下,您必须告诉调试器它是一个数组以及有多少元素,因为它无法从type * 推断出这一点。在frame varexpr 中,您可以使用--element-count(简称-Z)选项来做到这一点。还有一个方便的别名parray expr count

    1. 链表

    这个你将不得不用手展开。调试器无法知道哪个成员是下一个元素指针,或者您的终止条件是什么。因此,您必须编写一些脚本来告诉 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 的签名,然后您可以从中获取当前帧。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2022-06-12
    • 2019-03-24
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多