2012-04-16 82 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; 
} 

我也是在相同的位置獲得一個總線錯誤而使用這個庫vim編輯器。

請幫幫我。

謝謝

+0

將程序加載到dbx/gdb和「Ctrl-C」之類的調試程序中時,它會卡住。然後使用'where'或類似的命令檢查控制卡在哪裏卡住 – 2012-04-16 10:57:28

回答

0

確保程序卡住在getenv()電話嗎?我會更加懷疑互斥體:如果另一個線程持有互斥鎖,pthread_mutex_lock(&fgPTMutex);將會阻塞

+0

最初我懷疑這一點,但我試圖在任何地方使用printf,並在getenv()調用之前打印該行並在此之後卡住。我多次嘗試過相同的測試。 而且這個互斥鎖僅在這裏使用,沒有其他地方。 – pratick 2012-04-16 10:50:13

+0

我只能找到一個關於getenv阻止的[參考](http://www.unix.com/programming/1816-getenv-3c.html),但這可能是您的問題(儘管互斥鎖應該阻止這種情況 - 也許該程序的另一部分也使用getenvb/setenv?) – Attila 2012-04-16 11:05:55

+0

有點偏旁:是否有可能'Alloc(size);'拋出異常?如果是的話,你應該把'pthread_mutex_unlock'放在一個catch()塊中 – Attila 2012-04-16 11:09:28