2013-08-06 3 views
1

main() 함수가 실행되기 전에 프로그램이 중단됩니다. GDB에서main() 전에 크래시

int main(int argc, char **argv) 
{ 
    cerr << " MAAIN " << endl; 

메시지 : 나는이 사용하는 "cerr"를 결정

나는 "삭제"및 "무료"기능에 대한 코드를 검사 한
Reading symbols for shared libraries ...........+++............................ done 
CA(34652) malloc: *** error for object 0x7fff76694860: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff88e1782a in __kill() 
(gdb) bt 
#0 0x00007fff88e1782a in __kill() 
#1 0x00007fff8c4d2a9c in abort() 
#2 0x00007fff8c53184c in free() 
#3 0x00000001026a1db0 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow() 
(gdb) 

. 1. 어떤 가능한 문제가 될 수있다 :

if (x) delete x; 

이 질문에 대답 좀 도와주십시오 모든 삭제는이 같은 검사와 함께 완료? 2. 찾는 방법? (나는 컴파일을 위해 많은 파일과 cmake를 가진 큰 코드를 가지고있다).

P. Is there any way a C/C++ program can crash before main()?을 읽었지만 gdb massage를 보면 라이브러리가 괜찮을 것이라고 생각합니다.

+0

'if (x)'체크가 필요 없습니다. 아무것도 추가하지 않습니다. 'new'로 할당되지 않은 것을 삭제하고 있습니다. – juanchopanza

+0

juanchopanza, 좋은 생각, 고마워. 하지만 왜 (x)가 아무 것도하지 않는다면? 포인터는 0 – klm123

+0

으로 초기화됩니다. 왜냐하면 null 포인터에서'delete'를 호출하는 것이 no-op이기 때문입니다. – juanchopanza

답변

2

cout는 프로그램이 즉시 버퍼를 플래시하지 않는 cout 때문에 충돌 위치를 확인하는 좋은 방법이 아니다 그리고 당신의 프로그램이 cout 후하지만 버퍼를 세척하기 전에 충돌 가능성이 있습니다.

대신 cerr으로 확인하는 것이 좋습니다. 그리고 주 함수 앞에 전역 변수의 생성자가 호출합니다. 그래서 시작하기 전에 충돌이 있다고 생각한다면 그것들을 살펴보십시오.

다른 가능성은 main 함수를 호출하기 전에 발생하는 main 함수의 배열에 메모리를 할당하는 것입니다. 그들이 거대하면. 그들을 위해 메모리를 할당하려면 new을 사용해야합니다.

+0

나는 한판 승부를 cerr (같은 효과)로 변경했습니다. 감사. 나는 생성자를 조사하고 있지만 의심스러운 것을 찾을 수 없습니다. 그리고 전역 배열이 없습니다. – klm123

+0

주 기능의 큰 로컬 배열로 인해 이러한 문제가 발생할 수 있습니다. 주요 함수 나 전역 객체에 큰 배열이 있습니까? –

+0

내부에 배열을 포함하고있는'std :: string'에 메모리를 할당하는 동안 오류 메시지가 발생했다는 것을 알 수 있습니다. – Lochemage

1

std::basic_stringbuf<char, std::char_traits<char>...은 그것이 잘못되었다는 것을 말해줍니다. std::string. 한 가지 가능한 시나리오는 올바르게 구성되지 않았거나 배열을 잘 사용하지 않아서 겹쳐 쓰여진 문자열을 "자유롭게"하려고 시도하는 것입니다.

또는이 같은 그래서 당신은 다른 소스 파일의 일부 전역 변수에 의존 : 건설되고있다

이 경우
// main.cpp: 

... 
extern string str; // str lives in another .cpp file 
.... 
myclass x(str); // Construction using str. 

// otherfile.cpp 
string str("foobar"); 

, str의 시간 x에 의해 구성되지 않을 수 있습니다을하고, 문자열이 "유효하지 않습니다".

유사한 행에 다른 가능성이 있습니다.

여기 주소 : 0x7fff76694860이 스택에 있습니다. 항상 같은 가치라면, 그것이 어디에 있는지 추적 할 수 있습니다.

관련 문제