문제

무슨 방법이 있습을 위한 자동적으로 점점 스택 추적에서 유닉스 시스템의 차이점은 무엇입니까?내가 의미하지 않지 코어 파일이나 연결화 GDB,하지만 SIGSEGV 핸들러를 덤프 프로그램은 텍스트 파일입니다.

보너스 포인트 다음과 같은 추가 기능을 사용할 수 있습니다.

  • 추가 정보를 수집하에서 충돌 시간(예를 들어.config 파일).
  • 이메일 충돌 정보를 묶습니다.
  • 를 추가하는 기능이 dlopened 공유 라이브러리
  • 지 않 GUI
도움이 되었습니까?

해결책

만약 당신이 시스템에서 BSD backtrace 사용할 수 있는 기능을(Linux,os x1.5,BSD 물론),당신은 이것을 할 수 있는 프로그래밍 방식으로에 신호 처리기입니다.

예를 들어(backtrace 코드에서 파생된 IBM 예):

#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void sig_handler(int sig)
{
    void * array[25];
    int nSize = backtrace(array, 25);
    char ** symbols = backtrace_symbols(array, nSize);

    for (int i = 0; i < nSize; i++)
    {
        puts(symbols[i]);;
    }

    free(symbols);

    signal(sig, &sig_handler);
}

void h()
{
    kill(0, SIGSEGV);
}

void g()
{
    h();
}

void f()
{
    g();
}

int main(int argc, char ** argv)
{
    signal(SIGSEGV, &sig_handler);
    f();
}

출력:

0   a.out                               0x00001f2d sig_handler + 35
1   libSystem.B.dylib                   0x95f8f09b _sigtramp + 43
2   ???                                 0xffffffff 0x0 + 4294967295
3   a.out                               0x00001fb1 h + 26
4   a.out                               0x00001fbe g + 11
5   a.out                               0x00001fcb f + 11
6   a.out                               0x00001ff5 main + 40
7   a.out                               0x00001ede start + 54

이지 보너스 포인트를 얻을 위한 선택적 기능을(를 제외하고 요구하지 않는 GUI),그러나,그것의 이점을 가지고 아주 간단하고 필요가 없기 때문에 추가 라이브러리 또는 프로그램입니다.

다른 팁

FYI,

제안된 솔루션을 사용하여(backtrace_symbols 에서 신호 처리기)는 위험하게 깨졌습니다.그것을 사용하지 않는-

Yes,역추적 및 backtrace_symbols 을 생성 프로그램과 그것을 번역하는 상징적인 이름은,그러나:

  1. backtrace_symbols 할당하는 메모리를 사용하는 malloc 고 당신은 무료로 사용하다-만약 당신이 충돌하기 때문에 메모리 손상의 malloc 장할 가능성이 매우 높 손상 원인을 더 잘못입니다.

  2. malloc 및 free 보호하는 malloc 경기장을 가진 잠금을 내부적으로 합니다.수도 있 오류가 발생한 중에 malloc/잠금 촬영을 일으킬 것입니다 이러한 기능 또는 아무것도 그들을 통하여 죽은 잠급니다.

  3. 당신이 사용하는 표준을 사용림도 보호에 의해 잠급니다.오류가 발생한 경우에 printf 당신을 다시 한번 있습니다.

  4. 에서 32 비트 플랫폼(예:일반 PC 에의 2 년 전),커널이 공장에 반환 주소 내부 glibc 기능을 대신 당신의 오류 기능에서 당신의 스택,그렇게 단일의 가장 중요한 조각 정보에 관심이 있는 기능을 했는 프로그램으로 잘못을 것입니다 실제로 손상된 사람들에 플랫폼입니다.

그래서,코드 예제에서는 최악의 잘못처럼 보이는 작동하는지만,그것은 정말 당신에 실패할에서 예상치 못한 방법으로 생산하고있다.

BTW,에 관심있는 일을합니까?체크 니다.

환호 길라드.

여기에는 예입니다 얼마나 더 많은 정보를 사용하여 demangler.당신이 볼 수 있듯이 하나도 로그 stacktrace 하는 파일입니다.

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <cxxabi.h>

void sig_handler(int sig)
{
    std::stringstream stream;
    void * array[25];
    int nSize = backtrace(array, 25);
    char ** symbols = backtrace_symbols(array, nSize);
    for (unsigned int i = 0; i < size; i++) {
        int status;
        char *realname;
        std::string current = symbols[i];
        size_t start = current.find("(");
        size_t end = current.find("+");
        realname = NULL;
        if (start != std::string::npos && end != std::string::npos) {
            std::string symbol = current.substr(start+1, end-start-1);
            realname = abi::__cxa_demangle(symbol.c_str(), 0, 0, &status);
        }
        if (realname != NULL)
            stream << realname << std::endl;
        else
            stream << symbols[i] << std::endl;
        free(realname);
    }
    free(symbols);
    std::cerr << stream.str();
    std::ofstream file("/tmp/error.log");
    if (file.is_open()) {
        if (file.good())
            file << stream.str();
        file.close();
    }
    signal(sig, &sig_handler);
}

Dereks 솔루션은 아마도 최고의,하지만 여기에 대체 어쨌든:

최근의 리눅스 커널 버전을 허용할을 관장하는 스크립트나 프로그램입니다.할 수 있는 스크립트를 작성 catch the core dump,수집해 추가 정보가 필요하고 메일을 다시 모든 것을.이것은 세계적인 설정이지만,그래서 그것을 적용하는 모든 충돌하는 프로그램에서 시스템입니다.그것은 또한 루트 권한을 필요로를 설정합니다.그것을 통해 구성할 수 있는/proc/sys/kernel/core_pattern 파일입니다.설정 같은 것'|/홈/myuser/bin/나의 코어의 처리기-스크립트'.

Ubuntu 사람들은 이 기능을 사용합니다.

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