2013-12-08 25 views
2

我寫了一個簡單的使用assert()調用的c程序。我想用lldb分析它。使用lldb分析.DSYM文件

OS使用:OS X小牛

編譯器來編譯: 蘋果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

開始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

Thanks @Martin R.我學到了一些新東西! –

+0

只是爲了顯示Martin的答案的一些快捷方式,您可以從命令行'$ lldb -c/cores/core.5884'在覈心文件上運行lldb,並且在他的示例中選擇第4幀時,有一個非常方便的快捷方式, 'f 4'爲此。 「線程選擇」 - 「t」存在相同的快捷方式。 –

0

在命令提示符下編譯,在你有符號目錄相同的目錄,鍵入

lldb program-name 

然後用你想要的命令在這個官方gdb來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可以讀取的符號的目錄。要啓動調試會話,只需在終端輸入命令(如答案中所示),並以您想要的方式使用調試器。 –