2013-03-05 1 views
4

Android NDK 환경에서 'ABORTING: HEAP MEMORY CORRUPTION' 문제가 발생했습니다. 내가 ndk-gdb으로 역 추적하면어 버트 닝 : NDK에서 힙 메모리 손상 env env. (POCO 라이브러리, Sqlite3, Cocos2dx)

, 그것은 주로 libc.somalloc/dlfree 기능에서 발생하는 문제를 추적 오랜 시간 후에는 대부분 절대적으로 iOS ENV에 잘 작동 sqlite3_xxx 함수 호출, 내부에서 발생합니다.

나는 어디로 깊숙이 들어가야 할 지 찾을 수 없다.

누구나 비슷한 문제가 발생하여 해결 되었습니까?

+0

해결 했습니까? 나는 같은 호를 치고있다 – rydgaze

답변

3
  1. 메모리 문제가 있지만 'ABORTING: HEAP MEMORY CORRUPTION'은보고했습니다.

  2. Java 힙 또는 C/C++ 힙이 손상되었는지 알아야합니다. 아니면 아마 당신의 SQL. 로그가 유익하지 않은 경우 바이너리에서 오류 메시지를 찾으려고 시도 할 수 있습니다.

  3. C/C++ 힙이면 표준 malloc/calloc/free를 내 버전으로 대체하는 것이 효과적이었습니다.

    #define malloc(x) myMalloc(x, __FILE__,__LINE__,__func__) 
    

    등등; myMalloc()과 친구들은 디버그 정보를 출력하여 메모리가 할당되고 해제 된 위치를 찾을 수 있습니다. 나는 도서관의 근원을 가지고 그것을 컴파일 할 수 있었다. 그런 다음 로깅, 로깅, 로깅 ...

    또한 myMalloc()은 할당 된 메모리를 0으로 만들었습니다. 또 하나의 트릭은 더 큰 척을 할당하고 끝 부분에 가드 값을 넣는 것입니다. 이 값이 손상되면 - 알 수 있습니다.

  4. Java 힙인 경우 원시 함수 호출을 로그해야합니다. Java 힙에서는 문제가 발생하지 않았으며 일반적으로 Java는 JNI 관련 항목에 대해 불평합니다.

+0

고마워. 당신의 대답은 모든 개발자들이 최소한 시도해야하는 다소 황금률이지만, 나는 너무 게으른다고 생각합니다. – Locke

+0

BTW, 코드가 실제로 충돌하는 곳을 확인하기 위해 로그를 기록하는 더러운 방법을 선택했으며 스택 추적에 의해 환각을 느꼈습니다. 실제로 코드가 충돌하는 곳은 POCO :: NotificationQueue 클래스의 enqueueXXX 호출입니다. 나는 주변에서 실수를 한 것 같아. iOS 기기가 그 점에 대해 결코 불평하지 않았던 것은 재미 있습니다. – Locke

+0

지금까지 특정 컴파일러 옵션이나 확인해야하는 다른 빌드 설정이 있어야한다고 가정했습니다. 다시 한번 감사드립니다. – Locke

3

내 프로그램의 경우 스레드 안전 문제가있을 때 'ABORTING : HEAP MEMORY CORRUPTION'이 표시됩니다. 특히 Cocos2d-x 프레임 워크에서 의 ZipUtils 기능은 Android에서 동시에 .plist atlas 및 addImageAsync()을로드하면 충돌이 발생할 수 있습니다. 비록 코드가 iOS에서 잘 작동하지만.