문제

나는 알 수 없는 표준 C 기능이다.내가 무엇인지 궁금은 기술이기에 윈도우고*유닉스?(Windows XP 나의 가장 중요한 OS 를 이렇게 하에 지금이다.)

도움이 되었습니까?

해결책

우리가 사용했던 이를 위해 우리의 프로젝트:

https://www.codeproject.com/kb/threads/stackwalker.aspx

이 코드는 태 드러분 이럴이지만,그것은 잘 작동합니다.Windows 니다.

다른 팁

glibc 제공하는 프로그램()함수입니다.

http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

가 프로그램()및 backtrace_symbols():

에서 남자 페이지:

     #include <execinfo.h>
     #include <stdio.h>
     ...
     void* callstack[128];
     int i, frames = backtrace(callstack, 128);
     char** strs = backtrace_symbols(callstack, frames);
     for (i = 0; i < frames; ++i) {
         printf("%s\n", strs[i]);
     }
     free(strs);
     ...

방법 중 하나를 사이에 더 편리/OOP 방법의 결과를 저장하기 위해 backtrace_symbols()에는 예외 클래스 구성자.따라서 때마다,당신은 당신이 던지는 형식의 예외가 있다.그런 다음 기능을 제공합한 인쇄니다.예를 들어:


class MyException : public std::exception {

    char ** strs;
    MyException( const std::string & message ) {
         int i, frames = backtrace(callstack, 128);
         strs = backtrace_symbols(callstack, frames);
    }

    void printStackTrace() {
        for (i = 0; i 

...


try {
   throw MyException("Oops!");
} catch ( MyException e ) {
    e.printStackTrace();
}

Ta da!

참고:사용 최적화를 플래그 할 수 있습의 결과로 스택 추적을 정확하지 않습니다.이상적으로,하나는 이 기능을 사용하여 디버그에 플래그 및 최적화 플래그 off.

Windows 확인 StackWalk64()API(도에서 32 비트 윈도우).UNIX 사용해야 합니다 OS 원서 그것을 할 수있는 방법,또는 대체를 glibc 의 프로그램(),면 볼수 있습니다.

그러나 복용 Stacktrace 네이티브 코드에서는 드물게는 좋은 아이디어지지 않기 때문에 가능하지만,때문에 당신은 보통 달성하기 위해 노력하고 잘못된 것입니다.

대부분의 사람들도 stacktrace,말에 특별한 상황이 같은 경우 예외가 발생하는 주장이 실패하는 최악의 그리고 가장 잘못을 얻을 때 당신은 치명적인"예외"또는 신호처럼 세분화 위반이 발생합니다.

을 고려하면 마지막 문제는 대부분의 Api 를 요구할 것이 명시적으로 메모리를 할당하거나 그것이 내부적으로 합니다.그렇게 깨지기 쉬운 상태에서는 프로그램할 수 있는 현재에도 acutally 상황이 더 악화 할 수 없습니다.예를 들어,충돌 보고서(또는 코어 덤프)반영되지 않습니다 실제 문제의 원인,하지만 실패하여 처리합니다.)

나는 가정 당신은 노력을 달성하기 위하여는 치명적인 오류 처리하는 것으로,대부분의 사람들이 보는 것을 시도하려고 할 때에는 stacktrace.그렇다면,나는 것입에 의존하는 디버거(개발 중)시키는 과정을 코어 덤프에서 생산(또는 덤프 on windows).와 함께 적절한 기호 관리,당신은 아무런 문제가 없습니다.는 명령을 일으키는 사후.

플랫폼이 없다 독립적인 방법으로 그것을 할 수 있습니다.

가장 가까운 것이 당신이 할 수 있는 코드를 실행하지 않고 최적화를 달성할 수 있습니다.는 방법에 첨부할 수 있는 프로세스를 사용하여(visual c++디버거는 GDB)고 사용 가능한 스택 추적합니다.

Windows, CaptureStackBackTrace() 또한 옵션을 적게 필요한 준비 코드에 사용자의 끝보 StackWalk64() 는 않습니다.(또한,비슷한 시나리오를했다, CaptureStackBackTrace() 결국 더 나은 작업(더 안정적으로)이상 StackWalk64().)

당신이 해야 될 사용 션 라이브러리.

unw_cursor_t cursor; unw_context_t uc;
unw_word_t ip, sp;
unw_getcontext(&uc);
unw_init_local(&cursor, &uc);
unsigned long a[100];
int ctr = 0;

while (unw_step(&cursor) > 0) {
  unw_get_reg(&cursor, UNW_REG_IP, &ip);
  unw_get_reg(&cursor, UNW_REG_SP, &sp);
  if (ctr >= 10) break;
  a[ctr++] = ip;
}

귀하의 접근 방식 또한 것이 잘 작동하지 않는 한 당신이 전화에서 공유 라이브러리입니다.

사용할 수 있습니다 addr2line 명령 리눅스에서 도구들을 이용해서 자유 소프트웨어 함수/라인의 숫자는 해당 PC.

Solaris 가 pstack 명령한 복으로 리눅스.

나는 당신을 내 문서입니다.그것은 단지 몇 줄의 코드입니다.

사후에 디버깅

하지만 나는 현재 문제 64 의 이행.

과거 몇년간을 위해 사용하고있 Ian 랜스 테일러의 libbacktrace.그것은 많은 청소기 보다는 기능을 GNU C 라이브러리를 필요로 내보내는 모든 기호입니다.그것을 제공합에 대한 더 많은 유틸리티의 생성 역추적보다 libunwind.그리고 마지막으로,그것은 패배하여 보안 기능으로 접근 방식이 필요한 외부와 같은 도구 addr2line.

Libbacktrace 처음 부분의 GCC 배포하지만,그것은 지금 사용할 수 있 저자는 독립형으로 라이브러리 BSD 라이센스:

https://github.com/ianlancetaylor/libbacktrace

이 글을 쓰는 시점에서,나는 사용하지 않으면 아무것도 필요를 생성하는 역추적에서의 플랫폼에서 지원하지 않는 libbacktrace.

당신은 그것을 할 수 있는 걸 스택니다.에서 현실이지만,그것은 자주 쉽게 식별자를 추가에 호출 스택에서는 처음부의 각 기능과 팝 그 끝에,그냥 걸어는 인쇄의 내용이 있습니다.그것의 비트 피타로,그러나 그것은 잘 작동하고 저장됩니다 당신의 시간에서 끝입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top