2012-01-09 3 views
0

나는 C++ 소프트웨어 (서버)를 가지고 있으며 충돌이 발생한다. 정확히 정확히 모른다. 문제는 로그를 기반으로한다. 나는 리눅스가 후에 리눅스를 만들거나 그 프로세스를 덤프하려고한다. 나는이 파일을 어쨌든 가져 와서 gdb에 파일을 가져와야하는 것을 분석해야한다.gdb 가져 오기의 충돌/종료 시간에 프로세스 덤프가 발생합니까?

누구나 과거에 무엇을 했습니까? 정보 아이디어 나 다른 것을 누군가 도울 수 있습니까?

감사합니다.

답변

5

원하는 것은 충돌 위치를 찾기 위해 GDB와 함께 작동하는 일반적인 코어 덤프입니다. 자세한 내용은 http://linux.die.net/man/5/core을 참조하십시오.

데몬에 현재 디렉토리가있는 쓰기 권한이없는 경우 코어가 생성되지 않습니다. 리디렉션하려면 다음을 시도하십시오.

mkdir /tmp/corefiles 
chmod 777 /tmp/corefiles 
echo "/tmp/corefiles/core" > /proc/sys/kernel/core_pattern 
+0

''gcc' 컴파일러에 대한 플래그가 도움이됩니다. –

+0

@Basile Starynkevitch : Boths 플래그가 Makefile에 있습니다. – Svisstack

+0

코어를 가져 와서'gdb/path/to/daemon core'를 사용하여 디버그하십시오. –

1

코어 파일을 찾으십니까? 당신의 데몬을 시작하는 스크립트에서이 명령 (스크립트가 bash 때문이다 인터프리터를 가정)를 추가 : (기본값 일반적으로 0이다)에 "무제한"코어 파일의 최대 크기를 설정

ulimit -c unlimited 

.

+0

기술적으로 이것은 데몬이 아닙니다.이 프로그램은 화면의 콘솔 응용 프로그램입니다. 나는 무제한으로 설정했지만 핵심 파일을 가지고 있지 않습니다. – Svisstack

+0

콘솔에서 실행 중이라면 gdb에서 실행하십시오. – eduffy

+0

이 응용 프로그램은 항상 살아 있어야합니다. bash에서 실행 중일 때 충돌이 발생하면 gdb를 첨부 할 때 다시 시작합니다. gdb는 gdb를 종료 할 때까지 프로세스가 죽지 않도록합니다. – Svisstack

1

다른 사람들이 대답 했으므로 코어 덤프 파일을 얻을 수 있습니다. 환경을 적절하게 구성하십시오.

또 다른 방법으로, 일단 데몬이 이미 실행 중이고 충돌하기 전에 디버거를 통해 attach을 실행하는 것입니다. 당신이 -g -Wall`로 컴파일, 당신의 데몬의 소스 코드가있는 경우

그리고 당신은 또한 gdb --args/경로 /로는/데몬데몬 인수으로 데몬을 시작할 수 있습니다 ...

+0

고맙지 만 나에게 적용 할 수는 없지만 충돌 후 프로세스가 바인드 된 포트를 해제하지 않고 새로운 데몬이 다른 응용 프로그램 대신 시작되어이 응용 프로그램이 항상 살아 있어야하기 때문에 첨부 할 수 없습니다. – Svisstack

관련 문제