我寫了一個簡單的使用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
)
我寫了一個簡單的使用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
)
開始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
也許我誤解了你的問題。你提到「如何使用lldb分析這個核心」,所以這將是如何在程序崩潰後加載和分析核心文件*。 - 但我不確定,如果這是你想要的,或者如果你只是想調試你的程序(如其他答案中所述)。 –
Thanks @Martin R.我學到了一些新東西! –
只是爲了顯示Martin的答案的一些快捷方式,您可以從命令行'$ lldb -c/cores/core.5884'在覈心文件上運行lldb,並且在他的示例中選擇第4幀時,有一個非常方便的快捷方式, 'f 4'爲此。 「線程選擇」 - 「t」存在相同的快捷方式。 –
對不起,我沒有得到你。編譯完程序後,我得到了一個「a.out」,當我運行程序時,我得到了a.out.dSYM。讓我知道如何做到這一點的步驟。我已經提到了你分享的http://lldb.llvm.org/lldb-gdb.html。 – user376507
a.out是編譯器分配給編譯程序的默認名稱(您可以使用-o
它不是斷言()調用在生成.dsym目錄中的程序,但-g 編譯器指令。有關assert()調用的更多信息,請在 終端提示符處鍵入'man 3 assert'。 –
好的,明白了。我的錯。我認爲assert()生成.dsym – user376507