2011-03-12 2 views
0

나는이 파일 공유 기능을 제공하는 라이브러리를 구현했다.실행되지 않는 라인이 변경되면 빌드가 중단됩니다!

이 이미 두 번 일어난 :

먼저, 문자열에있는 경우 - 다른 경로, 경로 만 실행되고 있는지,하지만 난 몇 후 다른 경로에 맞춤법 소프트웨어를 변경하는 경우 std 라이브러리에서 분이 충돌합니다. 나는 바뀌었던 줄이 변경되지 않았 음을 확인했다. 내가 변화를 되돌릴 때, 그것은 다시 멋지게 작동합니다.

두 번째로 표준 소프트웨어에서 out-of-array 표준 basic_string 소멸자를 다시 검사하여 소프트웨어가 충돌합니다.

나는 모든 것을했는데 모든 라이브러리는 _HAS_ITERATOR_DEBUGGING과 일치했습니다.

4 시간 후에 문제가있는 파일이 TorrentFile.cpp/h 인 것을 발견했습니다.

함수를 추가하면 (호출되지는 않지만) 함수가 추가되면 프로그램이 해당 파일의 끝에 충돌하지만 해당 파일이 없으면 버그가 없습니다. 문제를 일으키는 코드 :

std::vector<TorrentFileListPacket> TorrentFile::GetFileMap() 
{ 
    std::vector<TorrentFileListPacket> vFiles; 
    return vFiles; 
}; 

이 코드를 주석 처리하면 충돌이 사라집니다.

이것은 정말 나를 미치게합니다!

저는 8 년 동안 개발자였습니다. 전에 이런 것을 본 적이 없습니다!

추가 정보

내 메모리는 OK, 나는 도서관은 RasterBar에서 libTorrent 수있는 Windows 7에 SP1과 함께 비주얼 스튜디오 2010을 사용하고 있는데 그것은 높일 연결합니다. 소프트웨어가 MFC를 사용 중입니다.

+1

C++에는 오버로드가 있으므로 새로 추가 된 함수가 호출되지 않는다고 가정 할 수 없습니다. –

+0

함수 이름을 GetFileMap101010101010101010101010101로 설정하고 같은 충돌이 발생합니다! – bratao

+3

** 모두 다시 빌드 ** – Erik

답변

6

크래시가 예상되는 위치와 완전히 다른 위치에서 메모리 손상이 심하게납니다. 대부분의 기능 추가 및 제거는 메모리 손상을 즉시 볼 수 있도록 메모리 레이아웃을 변경하는 것입니다.

가장 좋은 희망은 Purify 나 Valgrind 같은 것입니다.

+0

모든 검색이 ON (힙, 등 ..) 인 Application Verifier가 이미 있습니다. Devparter를 시도합니다 (Purify가 VS2010과 함께 작동하지 않음). 팁을 가져 주셔서 감사합니다. – bratao

1

아마도 모든 개체 파일과 라이브러리가 ABI와 호환되는지 확인하고 싶을 것입니다.

수많은 컴파일러 설정이 ABI를 변경합니다. 특히 디버그 및 릴리스 빌드 및 반복기 디버깅 일반적으로 표준 컨테이너의 구조체 레이아웃은 반복기 디버깅을 활성화 할 때 변경됩니다 (기본적으로 msvc의 모든 디버그 빌드에서 사용되며 릴리스 빌드에서는 해제 됨).

따라서 정적 파일이나 정적 라이브러리 또는 링크 할 DLL이 호환되지 않는 구성으로 작성된 경우 매우 비정상적인 동작을 보게됩니다. libtorrent를 사용하여 라이브러리와 동일한 구성으로 라이브러리를 빌드해야합니다. 많은 TORRENT_ * 정의는 실제로 일부 구조체 레이아웃 또는 함수 호출의 일부 측면을 변경합니다. 라이브러리를 빌드 할 때와 동일한 클라이언트 집합을 클라이언트에 정의해야합니다. 이 문제를 해결하는 한 가지 간단한 방법은 모든 소스 파일을 프로젝트로 가져 와서 모든 것을 함께 구축하는 것입니다.

0

libtorrent를 DLL (또는 그 문제에 대해 부스트)로 사용하는 경우 동일한 C 런타임에 대해 컴파일됩니까?

종종이 유형의 문제가 발생하면 MinGW (VS6.0의 CRT를 사용하는) 또는 Visual Studio의 이전 버전으로 컴파일 된 라이브러리를 호출하기 때문에 문제가 발생합니다. 메모리가 라이브러리에 의해 할당 된 다음 응용 프로그램에 의해 freeed되면 소멸자에서 이러한 유형의 오류가 발생합니다.

확실하지 않은 경우 Dependency Walker과 같은 도구에서 해당 DLL을 열 수 있습니다. 종속성 MSVCRT.DLL, MSVCR100.DLL 등을 찾습니다.

관련 문제