문제

를 만들고 싶은데 core dump 때마다 나의 프로세스 충돌.현재 저는 다음과 같은 이 방법:

  1. 을 구축하는 특별한"debug"프로그램의 버전을 사용하여"g"의 gcc/g++.
  2. 실행"ulimit-c unlimited"
  3. 이제 우리는 핵심 덤프할 때마다 프로그램이 중단됩니다.

그러나 나는 원하는 횟수를 최소화하도록 단계:

  • Core dump 항상을 얻을 만들어집니다.는 경우에도 그것은"출시"니다.사용자가 요청하지 않아야하는 명령을 실행하"ulimit -c unlimited"수 있습니다.
  • 는 core dump 의 역추적 할 수 있어야 파일을 제공,기능,라인의 숫자를 호출합니다.는 스택 추적 인간에 읽을 수 있는 형태입니다.
  • 나는 원하지 않을 구축하는 프로그램으로 디버그 빌드에"g".거나 적어도 그것은 없을 포함하는 모든 다른 디버깅 정보가 필요하지 않습을 생산하는 사람이 읽을 수 있는 스택을 추적합니다.일 것이기 때문에 출시 빌드 프로그램입니다.

그래서 나는 두 개의 질문:

  1. 을 만드는 방법 core dump 에서는"출시"의 구축 프로그램입니까?
  2. 다.지 않고 수동으로 실행하면"ulimit -c unlimited"
도움이 되었습니까?

해결책

일반적인 솔루션은 파일을 출시하기 전에 -g로 빌드하고 디버그 정보를 제거하는 것입니다. '스트립'명령을 찾으십시오. 디버그 정보가있는 파일을 보관하고이를 사용하여 고객으로부터 얻은 코어 덤프를 디버그하는 데 사용합니다.

사용자 컴퓨터에서 사람이 읽기 쉬운 백 트레이스를 인쇄하려면 (일부) 디버그 정보로 바이너리를 배포해야합니다. glibc에서 'backtrace ()'함수를 찾으십시오.

바이너리에 디버그 정보가 포함되어 있지 않더라도 코어 덤프가 생성됩니다 (ULIMIT가 적절하게 설정된 경우).

코어 덤프 생성을 보장하는 가장 좋은 방법은 아마도 이진을 실행하기 전에 Ulimit을 설정하는 스크립트에서 바이너리를 실행하는 것입니다.

다른 팁

  • 에 대한 핵심 제한,당신이 그것을 할 수 있습 C 를 호출하여 setrlimit.
  • 에 GNU(glibc)또는 BSD 시스템을 얻을 수있는,역추적에 의해 통화 backtrace 과 관련된 시스템에서 호출합니다.당신은 다음을 번역해야 함수를 주로 기능을 실행하여 이름 addr2line (또는 복제는 그것의 기능).
  • 사용하지 않는 -g, 에,당신은 여전히 얻을 수 있습니다:프로그램(제외하고는 인라인 기능이 나타나지 않습니다).

Google-Coredumper를 사용해 볼 수 있습니다.

멀티 스레드 애플리케이션에서 GDB 읽기 가능한 코드 럼프를 생성하기위한 깔끔한 도구 - 프로그램이 실행 중입니다. Coredumper 라이브러리를 응용 프로그램으로 컴파일하여 종료되지 않고 실행중인 프로그램의 핵심 덤프를 생성 할 수 있습니다.

http://sourceforge.net/projects/goog-cedumper/

  1. Linux에는 "릴리스"버전 및 "디버그"버전과 같은 것은 없습니다. "-g"를 사용하면 디버깅 정보가 포함 된 프로그램 만 구축합니다. 이 정보를 제거 할 수 있습니다.

업데이트되었습니다
실제로 나는 내 메시지에서 언급하지 않은 디버그와 릴리스 버전의 한 가지 가능한 차이점에 대해 말해야한다고 생각합니다. 릴리스 버전은 모든 것을 제거하기 위해 NDEBUG 정의와 함께 구축 될 수 있습니다. assert() 프로그램에서. 반대로 디버그 버전은 ndebug를 다음과 같이 정의하지 않고 구축해야합니다. assert() 버그를 찾는 데 도움이됩니다.

그러나 사용하지 않는 경우 assert() 차이가 없을 것입니다.

  1. 사용자는 자신의 프로필에서 Ulimit -C Unlimited를 설정할 수 있습니다.

  2. 일부 최적화로 컴파일 된 프로그램의 백 트레이스는 종종 유용한 줄 번호를 제공하지 않습니다.

  3. 디버깅 정보가 포함 된 버전을 구축하고 아카이브에 넣을 수 있습니다. 그런 다음 제거하고 스트라이퍼 바이너리를 고객에게 전달하십시오. 고객이 핵심 파일을 제공하는 경우 디버깅 정보와 고객의 핵심 파일이있는 버전을 사용하십시오.

  4. How to create a core dump in the "release" build of a program? 그것은 당신의 책임이 아니라 OS의 책임입니다.

코드가 릴리스 모드/고도로 최적화 된 버전 인 경우 인간 형태로 괜찮은 스택 트레이스를 거의 얻지 못합니다. -G 스위치를 사용하거나 스택 트레이스를 완전히 잊어 버리십시오 ... 둘 다 가질 수 없습니다 !! 이 시점으로 되돌아가는 것은 생산 환경에서도 코드가 충돌 할 것으로 예상하는 것처럼 들립니다. ???

코드를 수정하고 먼저 작동하는지 확인하지 않겠습니까?... 코드 냄새 .... 스니프 스니프

편집하다: 좋아, 위의 내 의견에서 약간 가혹한 일이 있었을 것입니다. 나는 거기에 가혹한 의도가 없었습니다 ... 독자들의 이익을 위해, 나는 여기에 게시 된 다른 질문에 대한 링크를 포함 시켰습니다. 대답 나는 신호를 사용하여 스택 트레이스를 만들고 파일로 리디렉션했습니다. OP의 질문에 도움이 될 것이며 문제 해결에 도움이 될 것입니다 ...

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