2014-12-25 5 views
3

내 프로젝트에서 충돌을 처리하고 스택 추적을 생성하기 위해 브레이크 패드를 사용하고 있습니다. 스택 추적에는 stackwalker에서 함수 호출 정보를 찾는 방법이 있습니다. 프로세스 여기 Finding_the_caller_frame 설명이 : 스택 트레이스 : 스택 스캐닝 대 콜 프레임 대 문맥에서 명령 포인터로 주어진 것

  • 프레임 정보 전화 실측치 : 발견 스택 주사
  • :

    • 발견 컨텍스트

    에 명령 포인터로 지정된 What`s 그들 차이점 ? 그리고 더 중요한 것은 그들이 디버깅 측면에서 어떻게 도움이 될 수 있는가?

    Thread 0 (crashed) 
        0 test_google_breakpad!crash [test_breakpad.cpp : 17 + 0x4] 
         r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c 
         r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 
         sp = 0xbea2cb50 lr = 0x00009025 pc = 0x00008f84 
        Found by: given as instruction pointer in context 
        1 test_google_breakpad!main [test_breakpad.cpp : 25 + 0x3] 
         r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c 
         r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 
         sp = 0xbea2cb50 pc = 0x00009025 
        Found by: call frame info 
        2 libc.so + 0x164e5 
         r4 = 0x00008f64 r5 = 0xbea2cc34 r6 = 0x00000001 r7 = 0xbea2cc3c 
         r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 
         sp = 0xbea2cc18 pc = 0x400c34e7 
        Found by: call frame info 
    
  • 답변

    3

    명령 포인터 방법은 이미 함수의 메모리 위치를 가리키는 CPU 레지스터가 있으므로 함수를 검색 할 필요가 없음을 의미합니다. 현재 스택 프레임을 찾는 가장 쉽고 신뢰할 수있는 방법입니다.

    다음으로 호출 프레임 기술을 사용하면 반환 주소가 저장된 스택 메모리의 위치를보고 현재 함수의 호출자를 찾을 수 있습니다. 이것은 "반환"이 반환 대상을 찾는 데 사용하는 정확한 기술입니다. 이전의 각 호출도 반환 값을 스택에 넣기 때문에이 기술을 체인화 할 수 있습니다. 이것은 꽤 안정적이지만 일부 스택 메모리가 손상된 경우 (아마도 스택 오버플로, 버그가있는 포인터 쓰기) 어쩌면 실패 할 수 있으며 하나 이상의 리턴 주소는 지워집니다.

    마지막으로 안정성이 가장 낮은 기술은 스택 메모리에서 함수 주소처럼 보이는 모든 것을 검색하는 것입니다. 이렇게하면 손상된 스택을 복구하는 데 도움이되지만 함수 주소와 별도로 데이터 (함수 포인터 포함)를 알기가 어려울 수 있으므로 추측이 필요합니다. 그러나 하나를 찾으면 휴지통이 아닌 스택을 찾으면 콜 프레임 기술로 다시 연결할 수 있습니다.