Я пытаюсь лучше понять LLDB, и в настоящее время я пытаюсь вызвать локально определенную функцию (используя LLDB expr
) при отладке некоторого кода. Для простоты, давайте рассмотрим эту игрушку код:вызов функции с использованием expr во время сеанса LLDB
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
Хорошо, я пытаюсь определить factorial()
вручную после ответа на этот SO question:
(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, то, что требуется, чтобы иметь возможность использовать factorial()
в выражениях в LLDB?
Некоторые подробности, касающиеся окружающей среды:
$ 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
Связанный: [gdb/lldb вызов функции и перерыв в нем] (https://stackoverflow.com/q/27775080/55075). – kenorb