Вызов функции с использованием expr во время сеанса LLDB

Я пытаюсь лучше понять 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

Хорошо, я пытаюсь определить factorial() вручную, следуя ответу на этот вопрос SO:

(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

1 ответ

Решение

Вы можете использовать анализатор выражений только для оценки выражений, которые запускают функции, если вы отлаживаете живой процесс. Вы не только не отлаживаете живой процесс, но также отлаживаете файл.o, который не полностью связан, поэтому он никогда не сможет работать. lldb может проверять файлы.o, выводить таблицы символов и тому подобное, но не все будет работать.

Вы хотите добавить небольшую функцию main в ваш файл "testing_lldb.c" и создать работоспособную программу (сбросьте флаг -c.) Затем установите точку останова на main:

(lldb) break set -n main

запустить программу

(lldb) run

затем, когда вы достигнете точки останова, попробуйте вызвать вашу функцию.

Другие вопросы по тегам