2010-12-14 5 views
2

openssl dll을 사용하는 축 dll을 사용하는 VC 2008 (C++)에서 개발 한 응용 프로그램이 있습니다. 그리고 체인에있는 누군가가 힙을 부패시킵니다. 위반 상황이 발생해서는 안되는 상황에서 내 응용 프로그램에서 "메모리 액세스 위반"을 일으키는 상황입니다. 그래서 사슬 축의 누군가가 뭔가를 부패시킵니다.하지만 누가 또는 무엇을 찾을 수 없습니다.메모리 위반/누출 찾기

DevPartner의 메모리 누수 도구를 사용해 보았지만 누수가 발견되지 않았습니다. 아무 것도 없습니다.

이 문제는 어떻게 해결해야합니까? 나는 axis와 ssl 문서를 여러 번 살펴 보았고 가능한 모든 메모리 관리 문제와 픽스를 구현하고 검사했지만 아무 소용이 없었다.

대단히 감사합니다! 마린

+1

정말로 자신의 코드가 아닙니까? 라이브러리는 출시 전에 이러한 유형의 문제를 확인합니다. – DumbCoder

+0

오류가 발생할 때의 스택 추적이 있습니까? 당신은 그것을 위해 윈드 ​​브레이를 시도 할 수 있습니다. –

+0

이 질문을보십시오 : http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows. 그것은 당신의 질문에 직접적으로 대답하지 않지만 언급 된 좋은 도구가 많이 있습니다. –

답변

2

라이브러리의 디버그 버전을 얻은 경우 MSVC는 디버그 malloc과 무료 및 디버그 새로 만들기 및 삭제 기능을 제공합니다. 여기에는 덮어 쓰기 감지와 같은 항목이 포함됩니다.

http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx

+0

시도했지만 그 결과를 얻지 못했습니다. 모두 얻을 수 있습니다. CardTerminalDesktopApplication.exe의 0x0066ca60에서 첫 번째 예외가 발생했습니다. 0xC0000005 : 0x0173613c 위치를 읽는 액세스 위반입니다. CardTerminalDesktopApplication.exe의 0x0066ca60에서 처리되지 않은 예외가 발생했습니다. 0xC0000005 : 0x0173613c 위치에서 읽는 액세스 위반입니다. 이미 충돌이 발생했습니다. – Marin

+1

나는 유효한 응답을 얻는 것을 처리하고, 그렇습니다 - 나는 누출을 얻는다! 그러나 출력은 더 이상 사용되지 않습니다. {145} 0x007F7328의 일반 블록, 64 바이트 길이입니다. 데이터 : 46 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 61 6E 64 .... 더 유익한 결과물을 얻으려면 어떻게해야합니까? #define _CRTDBG_MAP_ALLOC을 정의했습니다 ... – Marin

3

MS application verifier을 사용해보세요. Visual Studio와 통합되므로 "검증"을 직접 실행할 수 있습니다.

3

왜 누수가 부패 어떻게 든 책임을 질 수 있다고 생각합니까? 범위를 벗어난 액세스, 데드 포인터 액세스, 불법 캐스트 및 누출을 방지하기 위해주의해야합니다. 그것은 까다로운 일입니다. Valgrind는 이러한 종류의 문제를 해결하는 훌륭한 도구이지만 유감스럽게도 Win32에서는 사용할 수 없습니다. 코드를 이식 할 수 있다면 Linux에서 디버깅 해 볼 수 있습니다. 그렇지 않으면 Purify와 같은 상업용 도구를 사용해야하며 그렇지 않은 경우 로깅과 어설 션의 도움을 받아 좋은 방법으로 디버거를 사용해야합니다.

1

이 MSDN 문서가 당신이 찾고있는 해답이있을 수 있습니다 될 수있다 Finding a Memory Leak

는 또한이 LeakDiag 도구를 시도 할 수 있습니다. MSDN에이 문서에 대한 참조가없는 이유는 확실하지 않습니까?!?!? 하지만 깔끔한 기사가 있습니다 Codeproject.com