2010-12-09 5 views
0

이 문제를 해결하는 데 어려움이 있습니다. 도움을 요청할 시간입니다.이것은 무엇 일 수 있습니까? [프로그램 버그]

OS : OSX, 소 레오

GCC : GCC의 엑스 코드 버전 4.2.1

라이브러리 : gmpxx GMP

문제점 : 기능과 끝에 오른쪽 충돌되어

flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff835cd886 in __kill() 
(gdb) bt 
#0 0x00007fff835cd886 in __kill() 
#1 0x00007fff8366deae in abort() 
#2 0x00007fff83585a75 in free() 
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_() 
Previous frame inner to this frame (gdb could not unwind past this frame) 

내가 초기화 기능에서 free()를 호출하고 있지 않다, 그리고 함수가 바로 닫는 컬까지 제대로 실행 않는다 Y 중괄호 .. 충돌 지점은 로컬 객체 (오른쪽?)

재미있는 것은이의 소멸자에 있어야한다, 그래서 :

가) 프로그램은 (것) 정적, 그에만 연결하면 잘 작동 코드가 * .dylib에 빌드되어 동적으로로드되면 실패합니다.

b) 프로그램이 gmp/gmpxx의 완전히 다른 두 가지 버전과 동일한 방식으로 실패합니다. [4.3 뭔가 5.01]

c)는 모두 정적 및 동적 링크 버전은 우분투 10.5 LTS

코드가 내 컴파일러에 의해 생성에 잘, 그것은 서면으로 손되지 않은 코드를 작동합니다. 사용자 코드는 최상위 레벨 드라이버 프로그램에 의해 실행됩니다. 시스템은 수백 회 회귀 테스트를 성공적으로 수행합니다.

namespace flx { namespace gmp { 
string flx_mpf_get_str(mpf_class const &a) 
{ 
    mp_exp_t x; 
    std::string s = a.get_str(x,10,0); 
    char b[100]; 
    std::snprintf(b,100,"e%ld",(long)x); 
    return std::string(".")+s+b; 
} 
}} 

를하지만 나에게 잘 보이는 : 그러나 다음 손으로 쓴 코드는 특정 테스트 케이스에 사용된다. 함수의 스택 프레임에는 여러 mpz_class, mpq_class 및 mpf_class 객체가 포함되어 있습니다.

gmp/gmpxx의 버그 이외에도 내가 생각할 수있는 유일한 다른 시스템은 런타임 시스템 또는 생성 된 코드가 메모리를 손상시키는 것입니다. 할당되지 않은 "해제 된"주소는 의심 스럽습니다 (이 주소는 힙 근처에 없습니다). -g 플래그를 사용하여 gmp 버전을 빌드했지만 더 이상의 정보를 얻지 못합니다 (이는 gmpxx 클래스 소멸자에서 불량이 아닌 것으로 나타남).

몇 가지 아이디어가 필요합니다. 나는 지금 어디를 봐야할지 모른다. SO의 :

링크 소스

http://felix-lang.org:1116/ $/홈/skaller/펠릭스/펠릭스/구축/해제 최적화/테스트/GMP/GMP-0.cpp

메타에 미리 :)에서 들으 가격 인하가 작동하지 않습니다! 따라서 손으로 복사해야합니다.

은뿐만 아니라 그것을 좀 더 읽기 그리고 그것은 몇 가지 재미있는 물건을 가지고 있기 때문에 펠릭스 코드에 대한 링크에 던질 수 있음

(사용자 정의 구문처럼 당신은 당신이 typeclasses가 인스턴스화되는 것을 볼 수 있습니다 도서관에 가면)

http://felix-lang.org:1116/ $/home/skaller/felix/felix/빌드/릴리스 최적화/테스트/gmp/gmp-0.flx

답변

0

어디에서 gmp 소스를 얻었습니까? 32 비트 버전 일 수도 있습니다 (적어도 macports는 64 비트 소스를 제공하지 않습니다). 반면에 Snow Leopard는 기본적으로 64 비트입니다.

개인적으로 나는 모든 코드를 gcc -m32로 32 비트로 강제합니다. 너도 똑같이해볼 수있어.

BR,
주하

편집 : 동적 라이브러리에 의해 할당How to force /usr/bin/gcc -> /usr/bin/gcc -m32?

+0

gmp src from 5.01 gnu, 그렇습니다, 64 비트 AFAIK입니다. – Yttrill

+0

참고 : 32 비트 코드는 특별히 필요하지 않습니다. 내가 내 방식대로라면 내 시스템에서 완전히 금지 할거야. Linux에서 할 수는 있지만 Mac에서는 쉽지 않습니다. – Yttrill

0

당신은 할당을 해제 할 수없는 메모리. 아마도 그것이 여기의 문제입니다. 대답을 확인하십시오 : Shared libraries memory space

+0

그 대답은 나에게 가짜로 들린다. 분명히 그것은 C 가짜입니다. –

+0

그 대답은 Windows에서만 관련이 있습니다. – bmargulies

+0

대답은 가짜지만 합리적인 "리드"입니다. 공유 라이브러리에서 생성 된 객체의 할당 해제와 관련이있는 것 같아요. 애플에게이 권리가 있다고 믿지는 않을 것입니다. :) – Yttrill

관련 문제