2017-07-30 113 views
1

我試圖用g ++ 4.8重新編譯一個巨大的遺留應用程序,以便調試glibc detected memory corruption問題(使用AddressSanitizer)。以前我們使用g ++ 4.4.7。升級到G ++ 4.8 - exception_ptr.h不支持異常傳播

但是,編譯失敗:

/opt/rh/devtoolset-2/root/usr/include/c++/4.8.2/bits/exception_ptr.h:40:4: error: #error This platform does not support exception propagation.

在編譯自定義異常處理程序(我猜)。自定義異常處理程序只在一個地方使用exception_ptr

void reportOtherException(void) const 
{ 
    std::exception_ptr p = std::current_exception(); 
    std::string s = (p != 0 ? p.__cxa_exception_type()->name() : "null"); 

    printf("DvMain Bad Exception: '%s'\n", s.c_str()); 
    mErrorReporter(0, DvLog::WARNING, 0, Dv::NO_PROFILE, 0, DvLog::UNHANDLED_OTHER_EXCEPTION); 
} 

而且reportOtherException()這樣使用:

try 
{ 
    // Catch and log uncaught exceptions, then exit. 
    catch (const std::bad_exception& e) { exHandler.reportBadException(e);  } 
    catch (const std::exception& e)  { exHandler.reportStandardException(e); } 
    catch (...)       { exHandler.reportOtherException();  } 
} 

我很新的C++,不知道是什麼錯誤,即使手段。使用4.4.7並且不適用於4.8。

什麼需要改變什麼指針來編譯4.8?

編輯我

下面是一些額外的信息:

g++ --version 
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15) 

最小碼

DvComDefaultExceptionHandler_test.h

#include "DvCommon.h" 
#include "evt/DvEvt.h" 
#include "log/DvLog.h" 
#include "com/DvComErrorReporter.h" 

#include <new> 
#include <exception> 
#include <sys/time.h> 
#include <sys/resource.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <malloc.h> 
#include <bits/exception_ptr.h> 

class DvComDefaultExceptionHandler 
{ 
public: 
    DvComDefaultExceptionHandler(const DvComErrorReporter& er) {} 
    ~DvComDefaultExceptionHandler() { } 

    void reportOtherException(void) const 
    { 
     std::exception_ptr p = std::current_exception(); 
    } 

private: 

    static const DvComDefaultExceptionHandler* mpInstance; 
}; 

DvComDefaultExceptionHandler_test.cpp

#include "DvCommon.h" 
#include "com/DvComDefaultExceptionHandler_test.h" 


// Pointer to the single instance of the DvComDefaultExceptionHandler class. 
const DvComDefaultExceptionHandler* 
DvComDefaultExceptionHandler::mpInstance = 0; 

編譯命令和輸出

g++ -c -g -O0 -DDEBUG -Wall -Wextra -Wno-sign-compare -Wcast-align 
--ftemplate-depth-32 -march=native -ggdb -fPIC -Iinclude -I../../include 
-I../../src -I/usr/include/libxml2 -D_GNU_SOURCE 
-I/mnt/swdevel/DVMon/source_build/ext/ACE -D__ACE_INLINE__ 
-I/usr/local/include -I/usr/lib/qt-3.3/include 
-o DvComDefaultExceptionHandler.o DvComDefaultExceptionHandler_test.cpp 
In file included from ../../include/com/DvComDefaultExceptionHandler_test.h:76:0, 
       from DvComDefaultExceptionHandler_test.cpp:13: 
/opt/rh/devtoolset-2/root/usr/include/c++/4.8.2/bits/exception_ptr.h:40:4: error: #error This platform does not support exception propagation. 
# error This platform does not support exception propagation. 

EDIT II

跟蹤通過包括文件歸結爲__GCC_ATOMIC_INT_LOCK_FREE的值。運行這個簡單的程序打印'2'作爲__GCC_ATOMIC_INT_LOCK_FREE的值。

int 
main(int argc, char **argv) 
{ 
    printf("__GCC_ATOMIC_INT_LOCK_FREE = %d\n", __GCC_ATOMIC_INT_LOCK_FREE); 
} 

G ++ VERSION:

$ g++ --version 
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15) 

EDIT II

我已經與克++ 6.3.1嘗試過,上一個CentOS 7 VM上運行。仍然是同樣的問題。

源文件 - 一個行僅

#include <bits/exception_ptr.h> 

編譯命令:g++ -c -o test.o test.cpp

+0

我無法在Red Hat Enterprise Linux 6.9上用DTS 2重現這一點。請用'devtoolset-2-gcc-C++'軟件包版本來修改你的文章,一個簡單的例子(它可能是一些'#include'指令觸發的)和完整的編譯器命令行。 –

+0

你用-std = C++ 11編譯過嗎? – 2017-07-30 16:17:54

+0

我已更新最低代碼。我沒有與std = C++ 11編譯,相同的標誌爲4.4.7 – Danny

回答

0

首先,包括<bits/exception_ptr.h>直接在技術上不受支持。它在頭文件中說得很對。這在GCC 4.4中或多或少意外地工作。這個頭文件的C++ 11遷移破壞了它,因爲對於名稱空間的原因,C++ 98代碼不能使用ATOMIC_INT_LOCK_FREE宏,並且頭不再工作。

在GCC 7,這是固定的(再次意外),因爲這錯誤的一部分:

訣竅包括<bits/exception_ptr.h>直接應在此版本重新工作。

這意味着你的選項是:

  1. 編譯在C++ 11或更高模式的代碼(C++使用GCC 6 14推薦)。
  2. 使用GCC 7升級到DTS 7時,如果它變得可用,它具有重新啓用C++ 98 hack的上游修復程序。
  3. std::exception_ptr用於不透明類型,在C++ 11或更高版本模式下編譯它的實現,並將系統的其餘部分保留在C++ 98模式下。
  4. 使用另一個黑客,也許像這樣的:

    #include <exception> 
    #ifndef ATOMIC_INT_LOCK_FREE 
    # define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE 
    #endif 
    #include <bits/exception_ptr.h> 
    

    再次,這是完全不支持,但它不應該有任何比你有什麼今天(使用GCC 4.4)差。

+0

謝謝!我會嘗試#4黑客。我只想運行Address Sanitizer,4.8是最接近版本的版本。即使從4.4.7到4.8,也有很多新的錯誤/警告需要理清。轉向C++ 11將會是一項巨大的工作 - 可能幾個月。這是一個相當大的應用程序。 – Danny

0

我能夠重現使用dockerized Centos6您的問題,用gcc 4.8.2。將開發工具升級到版本6(gcc 6.3.1)後,您的代碼編譯時沒有任何問題。嘗試升級使用這些步驟開發工具(建議僅用於測試):

[testing-devtools] 
name=devtools multiple for CentOS 
baseurl=http://mirror.centos.org/centos/6/sclo/x86_64/rh/ 
gpgcheck=0 

  • 通過添加文件/etc/yum.repos.d/devtools-sclo.repo添加sclo centos6庫

  • 安裝devtoolset-6包:

    百勝安裝devtoolset -6-的binutils devtoolset -6- GCC-C++

  • 集的bash環境,新的版本:

    SCL使devtoolset-6的bash

現在嘗試重新編譯你的基地例如和完整的源代碼。

注意:同一個存儲庫還包含devtoolset-3和devtoolset-4的軟件包。如果需要,很容易嘗試。

+0

感謝您查看它。如另一個問題所述,升級devtools並不起作用。該說明僅適用於64位,似乎沒有32位回購可用(?) – Danny

+0

我創建了一個新的Centos 7 64位虛擬機。我試過g ++ 4.8,5.3和6.3.1。所有都有相同的錯誤。 cpp文件現在只有一行:'#include '。你是如何得到它的工作? – Danny

+0

@丹尼此標題不能直接包含。查看其內容。首先嚐試包括。 – pe3k