2010-07-13 4 views
2

이것은 완전히 나를 신비화합니다.두 개의 멀티 맵을 정의하는 C++이 프로그램을 중단시킵니다.

std::multimap<int, int> commands; 
std::multimap<std::string, std::string> config; 

코드는 문제없이 컴파일,하지만 난 그것을 실행할 때, 나는 다음과 같은 오류 얻을 : 그것을 제외하고,

*** glibc detected *** ./antares: free(): invalid pointer: 0xb5ac1b64 *** 

은 간단한데을 나는 나의 클래스 선언에 두 개의 라인을 가지고 어떻게 두 변수가 나중에 처리되는지와 아무 관련이 없습니다. 변수의 나머지 코드에서 모든 참조를 제거했습니다. 여전히 충돌합니다. 나는 줄 중 하나를 주석 처리했는데, 그 중 하나는 문제없이 실행되었다. 특정 변수에 오류가없는 방법은 무엇입니까? 나는 STL에 버그가 없다는 가정하에 일하고있다. 그러나 나는 내 코드가 어떻게 이런 일을 할 수 있는지에 대한 아이디어를 다 써 버렸다.

본인은 저에게 곤란을 겪었으므로 제공 할 수있는 도움에 감사드립니다. Wyatt

편집 : STL에 문제가 있다고 제안하는 것은 아닙니다. 버그가 내 코드에 있다는 것을 알고 있습니다. 알고 싶지 않은 것은 참조되지 않은 변수를 선언하면 오류가 발생할 수 있습니다. 왜 내 코드에 전혀 영향을 미칠까요?

내 코드는 길이가 수천 라인에 이르기 때문에 누군가가 읽을 때 가치가있는 것은 아니며, 나는 올바른 방향으로 나를 가리키는 누군가를 찾고 있습니다.

+2

아니요, 아니요, 코드에 버그가 있습니다. 두려운 것 같습니다.지도를 사용하면 간단히 노출됩니다. –

+2

코드를 실제로 보지 않아도 가정이 올바른지 판단 할 수 없습니다. – Cogwheel

답변

2

맞습니다.이 두 줄의 충돌이 아니라 단지 눈에 띄게 만듭니다. 정의

  • 먼저 떠나 당신의 변수 (수 있도록 프로그램의 충돌)

  • 초을 제거하거나 충돌 할 때까지 다른 부분을 코드의을 해제 :

    다음은이 문제를 진단하는 방법 일어나지 않습니다. 그런 다음 당신의 기억을 부패시키는 대략적인 영역을 알게 될 것입니다.

  • 세 번째 (장애를 중지했을 때 영역을 확보 한 후) 충돌이 다시 발생할 때까지 부분 실행을 시작합니다.

편집 : 나는 당신의 문제를 말하고 싶지만 당신이 multimap의 (복사 생성자 또는 할당 연산자가 없거나 그 같은)를 포함 코드입니다. 그것은 단지 야생의 추측이므로 많은 재고를 두지 마십시오.

7

GCC 또는 STL에 문제가 없다고 가정하면 정확합니다. 그러나지도에서 free 오류가 발생하면 다른 코드가 스택 스매싱 (또는 힙 스매싱)이 될 수 있습니다. 진정으로 끔찍한 버그. 스택 스매싱에 대한 가장 나쁜 부분은 중단이 버그가있는 객체가 아니라는 것입니다.

다음은 몇 가지 디버깅 정보입니다.

  • valgrind에서 앱을 실행합니다.
  • stl 디버깅을 활성화하기 위해 _GLIBCXX_DEBUG을 정의하십시오.
  • MALLOC_CHECK_=1을 환경 변수로 추가하십시오. 이렇게하면보다 나은 malloc 오류 메시지를 얻을 수 있습니다.더 많은 정보 here.
  • 드물게 나는 박살 내게 될 위치에 memory watch을 추가 할 수있었습니다. 그러나 스매싱이 발생할 위치를 예측할 수있는 경우는 거의 없습니다.
관련 문제