2012-04-16 2 views
0

라이브러리를 미리로드하여 "malloc"을 오버로드했습니다. 이 사용자 지정 "malloc"에서 환경 변수를 사용하여 내 "malloc"을 내 "malloc"에서 사용하도록 구별합니다.getenv()에서 프로그램이 멈춤.

몇 가지 "mallocs"후에 getenv() 호출에서 프로그램이 멈추는 문제가 있습니다. 나는 왜 프로그램이 그 안에 갇혀 있는지 알아낼 수 없다. 정력 편집기로이 라이브러리를 사용하는 동안

void* PerfTrackMallocInterposition::Malloc(size_t size) { 
    // Malloc with statistics 
    pthread_mutex_lock(&fgPTMutex); 


    char *checkCDBEnd=NULL; 
    static const char* CDBEndEnv = "checkCDBEnd"; 
    checkCDBEnd = getenv(CDBEndEnv); //program gets stuck here 

    if(checkCDBEnd!=NULL) 
    { 
     if(checkCDBEnd[0]=='1') 
     { 
      if(size>1024) 
      { 
       void *result = Alloc(size); //Call to custom malloc 
       pthread_mutex_unlock(&fgPTMutex); 
       return result; 
      } 
     } 
    } 


    void* result = (*fPMalloc)(size); //call to normal malloc 
    pthread_mutex_unlock(&fgPTMutex); 


    return result; 
} 

나는 또한 같은 위치에 버스 오류 :

코드는 다음과 같다.

도와주세요.

당신은

+0

dbx/gdb와 같은 디버거에 프로그램을로드하고 멈추었을 때 Ctrl-C를로드하십시오. 그리고 나서'where' 나 비슷한 명령을 사용하여 컨트롤이 멈추는 곳을 확인하십시오. –

답변

0

당신이 확인 프로그램이 getenv() 전화에 붙어 가져옵니다 감사? 다른 스레드가 뮤텍스를 보유하고있는 경우 pthread_mutex_lock(&fgPTMutex);이 차단됩니다.

+0

처음에는 그걸 의심하지만 어디서나 printf를 사용하려고했는데 getenv() 호출 전에 줄을 인쇄하고 그 후에 걸려 들었습니다. 나는 같은 시험을 여러 번 시도했다. 또한이 뮤텍스는 여기에서만 사용되며 다른 곳에서는 사용되지 않습니다. – pratick

+0

getenv 블로킹에서 단 하나의 [reference] (http://www.unix.com/programming/1816-getenv-3c.html)를 찾을 수는 있지만 이것이 문제가 될 수 있습니다 (mutexes가이를 방지하기로 한 것 - 어쩌면 프로그램의 또 다른 부분은 getenvb/setenv도 사용합니까?) – Attila

+0

조금씩 : 'Alloc (크기);'이 예외를 던질 가능성이 있습니까? 그렇다면'pthread_mutex_unlock'을'catch()'블록에 넣어야합니다. – Attila