【问题标题】:How do I print a pointer address without materializing the struct in LLDB如何在不实现 LLDB 中的结构的情况下打印指针地址
【发布时间】:2014-08-09 20:00:19
【问题描述】:

我试图找出程序中的几个变量中的哪一个是空的。不幸的是,lldb 只是告诉我,当我尝试构建它时它无法实现该结构。任何想法如何让 lldb 打印结构的地址(但不是结构)?

(lldb) print *arg3
error: Couldn't materialize struct: size of variable arg3 (8) disagrees with the ValueObject's size (0)
Errored out in Execute, couldn't PrepareToExecuteJITExpression
(lldb) print (int*) arg3
error: Couldn't materialize struct: size of variable arg3 (8) disagrees with the ValueObject's size (0)
Errored out in Execute, couldn't PrepareToExecuteJITExpression
(lldb) frame variable
(td_val_t *) out = 0x00007fff5fbfe5e8
(char *) fname = 0x00000001000029b0 "bokeh_wrap.visualize"
(td_val_t *) arg1 = <variable not available>

(td_val_t *) arg2 = <variable not available>

(td_val_t *) arg3 = <variable not available>

(PyObject *) pArgs = 0x00000001073cd1e0
(lldb) print @arg1
error: unexpected '@' in program
error: 1 errors parsing expression
(lldb) expr arg1
error: Couldn't materialize struct: size of variable arg1 (8) disagrees with the ValueObject's size (0)
Errored out in Execute, couldn't PrepareToExecuteJITExpression
(lldb) expr &arg1
error: Couldn't materialize struct: size of variable arg1 (8) disagrees with the ValueObject's size (0)
Errored out in Execute, couldn't PrepareToExecuteJITExpression

【问题讨论】:

    标签: c macos lldb


    【解决方案1】:

    您的 arg 变量不可用 - 这意味着 LLDB 不知道它们的位置

    因此,简短的回答是“不,你不走运”。有人可能会调查您的源代码/编译器设置以检查它们为什么不可用(超出该位置的范围?DWARF 只是因为它们被优化而忽略了它们?),但就目前而言,我们不知道变量在哪里,我们不能告诉你。

    更长的答案:您是否正在优化构建?您是否有机会在 -O0 处构建并仍然重现错误?如果是这样,这就是你的解决方案

    如果这只在优化代码中重现,可能是时候查看汇编代码(LLDB 有一个反汇编命令),并尝试找出您的程序从哪里访问 arg 变量(寄存器与某些内存位置)和手动发出对该位置的内存读取/寄存器读取,然后从那里进行检查

    【讨论】:

    • 好的,谢谢您的回答。这段代码恰好通过优化代码返回到调试版本。我猜东西在某处丢失了,但是如果我弹出堆栈足够多,我就会发现错误。我真的希望对于这些情况有一个简单的答案。
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2019-06-15
    • 2021-07-07
    • 2016-07-06
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多