在LLDB会话期间使用expr调用函数

时间:2015-06-11 16:26:44

标签: c lldb expr

我试图更好地掌握LLDB,目前我在调试某些代码时,仍然试图调用本地定义的函数(使用LLDB' s expr)。为简单起见,我们考虑一下这个玩具代码:

testing_lldb.c:

unsigned long factorial(unsigned input) {
    unsigned long ret_val = 0;

    if (input == 0)
        ret_val = 1;
    else
        ret_val = input * (factorial(input-1));

    return ret_val; 
}

我这样编译:

$ clang -g -Weverything -c lldb_test.c

然后键入以下命令运行LLDB:

$ lldb testing_lldb.o

在我的LLDB会话中,我希望能够致电factorial()。我的第一次尝试:

(lldb) expr unsigned long i = factorial(i);
error: 'factorial' has unknown return type;  
cast the call to its declared return type

错误消息包含一个明确的提示,所以我再试一次:

(lldb) expr unsigned long i = (unsigned long)factorial(i);
error: warning: function 'factorial' has internal linkage but is not defined
note: used here
error: Can't run the expression locally: Interpreter doesn't handle one of the expression's opcodes

好的,我尝试按照SO question的答案手动定义factorial()

(lldb) expr typedef unsigned long (*$factorial_type)(unsigned)
(lldb) expr $factorial_type $factorial_function = ($factorial_type)0x0000000000000000
(lldb) expr unsigned long i = (unsigned long)factorial(i);
error: warning: function 'factorial' has internal linkage but is not defined
note: used here
error: Can't run the expression locally: Interpreter doesn't handle one of the expression's opcodes

这给了我与上面完全相同的错误。我通过运行:

仔细检查了factorial()的起始地址
(lldb) image lookup -Avi -n factorial 

问题

鉴于 testing_lldb.c,在LLDB的表达式中使用factorial()所需的内容是什么?

有关环境的一些细节:

$ uname -r
3.16.0-4-amd64
$ lldb -v
lldb version 3.4.2 ( revision )
$ clang -v
Debian clang version 3.4.2-14 (tags/RELEASE_34/dot2-final) (based on LLVM 3.4.2)
Target: x86_64-pc-linux-gnu

1 个答案:

答案 0 :(得分:4)

如果要调试实时进程,则只能使用表达式解析器来计算运行函数的表达式。您不仅没有调试实时进程,而且还在调试.o文件 - 它没有完全链接 - 因此它永远无法运行。 lldb可以检查.o文件,转储符号表和类似的东西,但不是一切都能正常工作。

你想为你的" testing_lldb.c"添加一个小的main函数,并构建一个可运行的程序(删除-c标志。)然后在main上设置一个断点:

(lldb) break set -n main

运行程序

(lldb) run

然后当你点击断点时,尝试调用你的函数。