2013-12-08 4 views
2

Я написал простую программу c, которая использует вызов assert(). Я бы хотел проанализировать это с помощью lldb.Анализ файла .DSYM с помощью lldb

OS в использовании: OS X Mavericks

Компилятор используется для компиляции: компании Apple LLVM версии 5.0 (лязг-500.2.79) (на основе LLVM 3.3svn) Цель: x86_64-яблочно-darwin13.0.0 Модель модели: posix

-g компилятор сгенерирован .DSYM. Я хотел бы знать, как анализировать это ядро ​​с помощью lldb.

PS: Я собрал используя -g вариант (clang -g test.c)

+0

Это не утверждает() вызова в программе, которая генерирует каталог .dsym, но -g директива компилятора. Подробнее о том, как работает вызов assert(), введите «man 3 assert» в командной строке . –

+0

Хорошо, понял. Виноват. Я думал, что assert() сгенерировал .dsym – user376507

ответ

1

Start lldb, а затем выполнить команду

target create --core /cores/core.NNNN 

где «/cores/core.NNNN» ваш файл ядра. Простой пример:

$ lldb 

(lldb) target create --core /cores/core.5884 
Core file '/cores/core.5884' (x86_64) was loaded. 
Process 0 stopped 
* thread #1: tid = 0x0000, 0x00007fff8873c866 libsystem_kernel.dylib`__pthread_kill + 10, stop reason = signal SIGSTOP 
    frame #0: 0x00007fff8873c866 libsystem_kernel.dylib`__pthread_kill + 10 
libsystem_kernel.dylib`__pthread_kill + 10: 
-> 0x7fff8873c866: jae 0x7fff8873c870   ; __pthread_kill + 20 
    0x7fff8873c868: movq %rax, %rdi 
    0x7fff8873c86b: jmpq 0x7fff88739175   ; cerror_nocancel 
    0x7fff8873c870: ret  

(lldb) bt 
* thread #1: tid = 0x0000, 0x00007fff8873c866 libsystem_kernel.dylib`__pthread_kill + 10, stop reason = signal SIGSTOP 
    frame #0: 0x00007fff8873c866 libsystem_kernel.dylib`__pthread_kill + 10 
    frame #1: 0x00007fff85de835c libsystem_pthread.dylib`pthread_kill + 92 
    frame #2: 0x00007fff87554bba libsystem_c.dylib`abort + 125 
    frame #3: 0x00007fff8751ea5f libsystem_c.dylib`__assert_rtn + 321 
    frame #4: 0x000000010c867f59 a.out`main(argc=1, argv=0x00007fff53398c50) + 89 at prog.c:7 
    frame #5: 0x00007fff872b65fd libdyld.dylib`start + 1 

(lldb) frame select 4 
frame #4: 0x000000010c867f59 a.out`main(argc=1, argv=0x00007fff53398c50) + 89 at prog.c:7 
    4 int main(int argc, char **argv) 
    5 { 
    6  int i = 0; 
-> 7  assert(i != 0); 
    8  return 0; 
    9 } 
    10 

(lldb) p i 
(int) $0 = 0 
+1

Возможно, я неправильно понял ваш вопрос. Вы упомянули «как анализировать это ядро ​​с помощью lldb», так что это будет как загрузить и проанализировать основной файл * после того, как ваша программа потерпит крах. - Но я не уверен, если это то, что вы хотели, или если вы просто хотите отлаживать свою программу (как описано в другом ответе). –

+0

Спасибо @ Мартин Р. Я узнал что-то новое! –

+0

Чтобы показать некоторые ярлыки ответа Мартина, вы можете запустить lldb в своем основном файле из командной строки '$ lldb -c/corees/core.5884' и при выборе кадра 4 в его примере есть очень удобный ярлык, 'f 4' для этого. Тот же самый ярлык существует для 'thread select' -' t'. –

0

В командной строке в той же директории, где у вас есть каталог символов, типа

lldb program-name 

затем использовать команды, которые вы хотите как в этом официальном БГД в lldb командной карты:

lldb-gdb

+0

Извините, я вас не понял. Я получил «a.out» после того, как я скомпилировал программу, и когда я запустил программу, я получил a.out.dSYM. Сообщите мне, как это сделать. Я уже упоминал об этом http://lldb.llvm.org/lldb-gdb.html. – user376507

+0

a.out - это имя по умолчанию, которое компилятор присваивает вашей скомпилированной программе (вы можете использовать опцию -o для выбора другого имени). a.out.dSYM - это каталог, в котором хранится компилятор (после того, как вы дали ему директиву -g) символы, которые lldb может читать во время сеанса отладки. Чтобы запустить сеанс отладки, просто введите в терминал команду (как указано в ответе) и используйте отладчик так, как вы хотите. –