blob: d89f54ba1a337c6f8a13cb7c1faf6b8072032797 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
#ifndef _GEMFIRE_STACKFRAME_HPP_
#define _GEMFIRE_STACKFRAME_HPP_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ace/OS.h>
#ifdef _WIN32
#include <Windows.h>
#include <DbgHelp.h>
#else
//Since we dont compile with g++ on Sun
#ifdef _SOLARIS
#define DEMANGLED_SYMBOL_BUFSIZE 512
#include <demangle.h>
#else
#include <exception>
#include <cxxabi.h>
#endif
#endif
namespace gemfire {
class StackFrame
{
public:
char m_offset[12];
char m_symbol[256];
char m_module[700];
char m_string[1024];
StackFrame( )
{
}
char * asString();
~StackFrame( )
{
}
#ifdef _WIN32
#ifndef _WIN64
// ------------ WINDOWS -----------
void init( const char* btline )
{
m_offset[0] = '\0';
m_symbol[0] = '\0';
m_module[0] = '\0';
if (!UnDecorateSymbolName(btline, m_string, 1023, UNDNAME_COMPLETE)) {
strncpy( m_string, btline, 1023 );
}
m_string[1023] = '\0';
}
#endif
#else
// ------------ UNIX -----------
void init( const char* btline )
{
m_string[0] = 0;
int status = 0;
char * symbol = extractSymbol( btline );
char * demangled = NULL;
#ifdef _SOLARIS
demangled = new char[DEMANGLED_SYMBOL_BUFSIZE];
status = cplus_demangle( symbol, demangled, DEMANGLED_SYMBOL_BUFSIZE);
#else
demangled = abi::__cxa_demangle( symbol, 0, 0, &status );
#endif
if ( status != 0 ) {
ACE_OS::strncpy( m_symbol, symbol , sizeof(m_symbol));
} else {
ACE_OS::strncpy( m_symbol, demangled, sizeof(m_symbol));
}
#ifdef _SOLARIS
GF_SAFE_DELETE_ARRAY( demangled );
#else
free(demangled);
#endif
delete [] symbol;
}
#endif
// ------------ ALL -----------
char * extractSymbol( const char * btline )
{
/*
This code receives a stacktrace line in the forms:
/export/hoth2/framework/lib/debug/libeventtest.so(_ZN7gemfire13testframework9EventTest17doEventOperationsEv+0x4a0) [0x93a1a0]
/export/hoth2/framework/lib/debug/libeventtest.so(doRegionOperations+0x13d) [0x92c9e3]
Client [0x804ae56]
Client [0x804c9ca]
/lib/tls/libc.so.6(__libc_start_main+0xda) [0xe1c79a]
Client(_Znwj+0x41) [0x804a6ed]
Sets members: m_module and m_offset
returns the symbol
*/
size_t btlen = strlen( btline );
char* symbol = new char[btlen + 1]; // COVERTY --> 30298 Out-of-bounds access
symbol[0] = '\0';
m_module[0] = '\0';
m_offset[0] = '\0';
if ( strchr( btline, '+' ) ) {
sscanf( btline, "%[^(](%[^+]+%[^)])", m_module, symbol, m_offset );
} else {
sscanf( btline, "%[^ ] [%[x01-9a-f]]", m_module, m_offset );
}
char* shortmodule = NULL;
if ( NULL != (shortmodule = strrchr( m_module, '/' )) ) {
char* tmp = new char[btlen + 1]; // COVERTY --> 30298 Out-of-bounds access
ACE_OS::strncpy( tmp, shortmodule + 1 , btlen);
ACE_OS::strncpy( m_module, tmp, btlen );
delete [] tmp;
}
return symbol;
}
};
}
#endif /* _GEMFIRE_STACKFRAME_HPP_ */