2013-12-08 3 views
2

나는 assert() 호출을 사용하는 간단한 c 프로그램을 작성했습니다. lldb를 사용하여 분석하고 싶습니다. 사용ldsb를 사용하여 .DSYM 파일을 분석

OS : 애플 LLVM 버전 5.0 (그 소리-500.2.79) (LLVM의 3.3svn 기준) 대상 : x86_64에-사과 darwin13.0.0 OS X 매버릭스

컴파일러는 컴파일하는 데 사용 스레드 모델 : posix

-g 컴파일러 옵션은 .DSYM 디렉토리를 생성했습니다. lldb를 사용하여이 코어를 분석하는 방법을 알고 싶었습니다.

PS : 나는 당신이 원하는 명령을 사용하면 귀하의 디렉토리가 같은 디렉토리를 입력 한 다음

lldb program-name 

에서 -g 옵션 명령 프롬프트에서 (clang -g test.c)

+0

그것은 .dsym 디렉토리를 생성하는 프로그램에서 어설 션() 호출하지만, -g 컴파일러 지시문이 없습니다. assert() 호출이 작동하는 방법에 대한 자세한 내용을 보려면 터미널 프롬프트에서 'man 3 assert'를 입력하십시오. –

+0

알겠습니다. 알겠습니다. 내 잘못이야. 나는 assert()가 .dsym을 생성했다고 생각했다. – user376507

답변

1

시작 :이 공식 GDB에서와 같이 명령지도를 lldb하기 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

고마워요 @ 마틴 R. 나는 새로운 것을 배웠습니다! –

+0

마틴의 대답에 대한 바로 가기를 보여주기 위해서 명령 줄'$ lldb -c/core/core.5884'에서 코어 파일에 lldb를 실행할 수 있으며 그의 예제에서 프레임 4를 선택할 때 매우 편리한 바로 가기가 있습니다. 이것에 대해서'f 4'가됩니다. 'thread select' - t에 대해서도 같은 바로 가기가 존재합니다. –

0

를 사용하여 컴파일

lldb-gdb

+0

미안하지만, 나는 당신을 얻지 못했다. 나는 프로그램을 컴파일 한 후 "a.out"을 얻었고 프로그램을 실행했을 때 a.out.dSYM을 얻었다. 그것을하는 방법에 대한 단계를 알려주십시오. 이미 공유 한 http://lldb.llvm.org/lldb-gdb.html을 참조했습니다. – user376507

+0

a.out은 컴파일러가 컴파일 한 프로그램에 할당하는 기본 이름입니다 (-o 컴파일러 옵션을 사용하여 다른 이름을 선택할 수 있음). a.out.dSYM은 디버거 세션 중에 lldb가 읽을 수있는 기호를 컴파일러가 저장 한 디렉토리입니다 (-g 지시문을 부여한 후). 디버그 세션을 시작하려면 터미널에 명령을 입력하고 (대답에 표시된대로) 원하는 방식으로 디버거를 사용하십시오. –