2012-04-17 4 views
3

그래서 glibc가 충돌 할 때 * glibc가 감지되었습니다. * 충돌 메시지가 있습니다. 그런 다음 모든 아니라 좋은glibc 충돌 무시

*** glibc detected *** ./odin: free(): invalid pointer: 0xbfba4444 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb75f9161] 
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb75fa9b8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb75fda9d] 
/usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb77da2ef] 

처럼, 역 추적의 무리를 인쇄하지만, 일 충돌, 내가에 실제 포인트를 역 추적을()하고 다음은 addr2line하는 시스템 호출을 사용하여 인쇄 봤는데 다른 경우 함수 대신. 그러나 glibc 충돌이 발생하면 호출 한 모든 신호 핸들러를 우회합니다.

이러한 glibc 충돌을 방지 할 방법이 있습니까?

답변

3

메모리 기능을위한 옵션으로 mallopt을 사용하여 토글 할 수 있습니다. 프로그램의 소리를 통해 M_CHECK_ACTION을 0으로 설정하여 프로그램을 즉시 종료하지 않으려면 실행을 계속할 수 있습니다. 어떤 경우에는 2이 원하는 것을 수행 할 수 있는지 확인하십시오. test1.c
이 하나가 오류를 무시하고 계속한다 : test2.c이 하나의 오류에 중단
: test3.c

3

IIRC을, glibc는 실제로 abort()를 호출, 그래서 SIGABRT 처리

이 작은 프로그램은 일반 glibc는 오류가 발생합니다 그로부터 백 트레이스를 인쇄하면 필요한 정보를 얻을 수 있습니다.

그러나 valgrind를 시도해 보시기 바랍니다. 메시지를 받으면 메모리 손상 문제가 있음을 알 수 있습니다.

사이드 코멘트 (중복되는 경우 죄송합니다. ;-)) : 코어 덤프는 종종 백 트레이스만큼 유용합니다. 예를 들어 bash에 ulimit -c unlimited을 설정하십시오. 프로그램이 충돌하면 core. (또는 단지 core)이라는 파일이 생성됩니다.이 파일은 실행중인 시스템에 따라 다르며, 시스템을 실행하면 abrtd 코어 파일은 실수로 입력하지 않으면 /var/cache/abrt에 저장됩니다. 그런 다음 gdb -c core a.out을 실행하여 gdb를 사용하여 코어 파일을 검사 할 수 있습니다. gdb 세션은 마치 프로세스가 충돌 한 것처럼 보일 것입니다.

+0

흠, 내 프로그램에 꽤 오랜 시간 동안 신호 (SIGABRT, blah)가 있었고 트리거하지 않았습니다. ** 편집 ** ** 실제로 트리거를 실행했지만, 방금 실행하지 않았습니다. 그것을 보지 마라. 나는 valgrind도 시도 할 것이다. 그러나 내가 어떻게해서든지 아무것도하지 않았던 때가 이제까지 붙 잡히게되었다. – kamziro