2009-11-02 8 views
7

나는 프로그램과 실패가 : 나는 malloc/free 함께 할 수있는 뭔가 상상C에서 gdb의 St9bad_alloc 실패를 어떻게 디버깅 할 수 있습니까?

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): St9bad_alloc 

,하지만 어느 모르겠어요.

스택 추적을 볼 수 있도록 오류가 발생해도 중단 점이 될 수있는 breakpoint는 무엇입니까?

이 프로그램은 gcc 3.4.2로 컴파일 된 C와 C++의 조합입니다.

답변

12

예외를 발생시키는 것은 실제로 malloc/free가 아니며 응용 프로그램의 C++ 부분에서 확실히 "새로운"것입니다. "new"가 할당하기에는 너무 큰 매개 변수를 제공하는 것 같습니다. 당신이 GDB로 충돌 덤프를로드 할 때

int * p = new int[50000000]; 

는 역 추적 말한다 대상 :

'표준 : : bad_alloc 뿐이다은'예를 들어 다음 코드에 의해 발생? 덤프를 생성 할 수없는 경우 GDB에 when exception is thrown or caught을 중지하도록 요청할 수 있습니다. 불행하게도, GDB 만 지원 다음 구문의 일부 버전 :

예외가 발생했을 때 응용 프로그램을 중단 할 수 있습니다
catch throw 

. 그러나, 도움에 당신은 최신 버전에

catch throw std::bad_alloc 

를 실행 할 수 있어야 것을 알 수있다.

그리고 잊지 마세요 :

다른 유용한 정보에 대한 좋은 소스입니다

(GDB)의 도움 캐치.

+0

"예외가 Throw되거나 catch 된 경우"에 대한 링크는 404입니다. – Karl

0

일부 메모리가 덮어 써서 메모리 할당 시스템의 상태가 손상 될 가능성이 있습니다 (일반적으로 메모리 블록이 응용 프로그램에 반환되기 전이나 후에 유지됨).

가능성이있는 경우 (즉, x86 Linux를 사용중인 경우) Valgrind에 프로그램을 실행하면 손상이 발생한 위치를 정확하게 표시 할 수 있습니다.

0

존재하지 않는 파일을 읽을 때이 작업을했습니다. 파일 내용에 대한 내부 버퍼를 만들려고했지만 파일이 없기 때문에 완충기가 망 쳤어.

int lenth_bytes; 
length_bytes = in_file.tellg(); 
new char [length_bytes]; // length_bytes hadn't been initialised!!!! 

아이들을 기억하십시오. 항상 변수 D를 초기화하고 0을 확인하십시오.

관련 문제