2015-06-11 1 views
2

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

Связанный: [gdb/lldb вызов функции и перерыв в нем] (https://stackoverflow.com/q/27775080/55075). – kenorb

ответ

4

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

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

(lldb) break set -n main 

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

(lldb) run 

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

+0

Спасибо! Это очень ценится. –

Смежные вопросы