Allows multiple backtraces objects, as long as they are fully created.

This commit is contained in:
Jean-Paul Chaput 2016-08-10 16:13:21 +02:00
parent a19bfa2698
commit 4aec49e08a
2 changed files with 7 additions and 5 deletions

View File

@ -413,7 +413,7 @@ namespace Hurricane {
// Class : "Hurricane::Backtrace". // Class : "Hurricane::Backtrace".
int Backtrace::_callCount = 0; bool Backtrace::_inConstructor = false;
TextTranslator Backtrace::_textTranslator = TextTranslator::toTextTranslator(); TextTranslator Backtrace::_textTranslator = TextTranslator::toTextTranslator();
const size_t Backtrace::_stackSize = 50; const size_t Backtrace::_stackSize = 50;
@ -428,7 +428,7 @@ namespace Hurricane {
Backtrace::Backtrace () Backtrace::Backtrace ()
: _stack() : _stack()
{ {
if (_callCount > 0) { if (_inConstructor) {
_stack.push_back( "[BUG] Backtrace::Backtrace(): An error occurred in the backtace *istself*." ); _stack.push_back( "[BUG] Backtrace::Backtrace(): An error occurred in the backtace *istself*." );
_stack.push_back( "" ); _stack.push_back( "" );
_stack.push_back( " Under RHEL 6, this may be due to a link with a wrong version of <libbfd>," ); _stack.push_back( " Under RHEL 6, this may be due to a link with a wrong version of <libbfd>," );
@ -438,7 +438,7 @@ namespace Hurricane {
_stack.push_back( " For other OSs, check for any problems related to BFD." ); _stack.push_back( " For other OSs, check for any problems related to BFD." );
return; return;
} }
++_callCount; _inConstructor = true;
#if (defined __linux__ || defined __FreeBSD__ || defined __APPLE__) #if (defined __linux__ || defined __FreeBSD__ || defined __APPLE__)
void* rawStack [ _stackSize ]; void* rawStack [ _stackSize ];
@ -484,6 +484,7 @@ namespace Hurricane {
_stack.push_back( symbols[i] ); _stack.push_back( symbols[i] );
} }
} }
#else
# ifdef __APPLE__ # ifdef __APPLE__
boost::regex re ( "(\\d+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+\\+\\s+(\\d+)" ); boost::regex re ( "(\\d+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+\\+\\s+(\\d+)" );
boost::cmatch match; boost::cmatch match;
@ -507,11 +508,12 @@ namespace Hurricane {
_stack.push_back( "Backtrace only supported under FreeBSD, Linux and OSX." ); _stack.push_back( "Backtrace only supported under FreeBSD, Linux and OSX." );
# endif # endif
#endif #endif
_inConstructor = false;
} }
Backtrace::~Backtrace () Backtrace::~Backtrace ()
{ --_callCount; } { }
string Backtrace::htmlWhere () const string Backtrace::htmlWhere () const

View File

@ -50,7 +50,7 @@ namespace Hurricane {
inline std::string _getTypeName () const; inline std::string _getTypeName () const;
inline std::string _getString () const; inline std::string _getString () const;
private: private:
static int _callCount; static bool _inConstructor;
static TextTranslator _textTranslator; static TextTranslator _textTranslator;
static const size_t _stackSize; static const size_t _stackSize;
std::vector<std::string> _stack; std::vector<std::string> _stack;