在 LLDB 会话期间使用 expr 调用函数
calling a function using expr during an LLDB session
我正在努力更好地掌握 LLDB,目前在调试某些代码时尝试调用本地定义的函数(使用 LLDB 的 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
这给了我与上面完全相同的错误。我通过 运行ning:
仔细检查了 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
如果您正在调试实时进程,则只能使用表达式解析器来评估 运行 起作用的表达式。您不仅没有调试实时进程,而且还调试了一个 .o 文件——它没有完全链接——所以它永远不会 运行。 lldb 可以检查 .o 文件、转储符号表和类似的东西,但并不是所有的东西都能工作。
您想向 "testing_lldb.c" 添加一个小的 main 函数,并构建一个 运行nable 程序(删除 -c 标志。)然后在 main 上设置一个断点:
(lldb) break set -n main
运行 程序
(lldb) run
然后当你到达断点时,尝试调用你的函数。
我正在努力更好地掌握 LLDB,目前在调试某些代码时尝试调用本地定义的函数(使用 LLDB 的 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
这给了我与上面完全相同的错误。我通过 运行ning:
仔细检查了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
如果您正在调试实时进程,则只能使用表达式解析器来评估 运行 起作用的表达式。您不仅没有调试实时进程,而且还调试了一个 .o 文件——它没有完全链接——所以它永远不会 运行。 lldb 可以检查 .o 文件、转储符号表和类似的东西,但并不是所有的东西都能工作。
您想向 "testing_lldb.c" 添加一个小的 main 函数,并构建一个 运行nable 程序(删除 -c 标志。)然后在 main 上设置一个断点:
(lldb) break set -n main
运行 程序
(lldb) run
然后当你到达断点时,尝试调用你的函数。