我試圖用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
我無法在Red Hat Enterprise Linux 6.9上用DTS 2重現這一點。請用'devtoolset-2-gcc-C++'軟件包版本來修改你的文章,一個簡單的例子(它可能是一些'#include'指令觸發的)和完整的編譯器命令行。 –
你用-std = C++ 11編譯過嗎? – 2017-07-30 16:17:54
我已更新最低代碼。我沒有與std = C++ 11編譯,相同的標誌爲4.4.7 – Danny