0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-30 17:10:48 +01:00

Move printStackTrace into new stacktrace.h/cpp; improve detection of execinfo.h.

This commit is contained in:
Andy Schwerin 2012-04-05 15:44:23 -04:00
parent 7cb696d776
commit 890d3b586d
7 changed files with 69 additions and 41 deletions

View File

@ -779,8 +779,11 @@ def doConfigure(myenv):
l + boostCompiler + boostVersion ], language='C++' ):
Exit(1)
if not conf.CheckCXXHeader( "execinfo.h" ):
myenv.Append( CPPDEFINES=[ "NOEXECINFO" ] )
if (conf.CheckCXXHeader( "execinfo.h" ) and
conf.CheckDeclaration('backtrace', includes='#include <execinfo.h>') and
conf.CheckDeclaration('backtrace_symbols', includes='#include <execinfo.h>')):
myenv.Append( CPPDEFINES=[ "MONGO_HAVE_EXECINFO_BACKTRACE" ] )
myenv["_HAVEPCAP"] = conf.CheckLib( ["pcap", "wpcap"], autoadd=False )

View File

@ -34,6 +34,7 @@ clientSource = [
'mongo/util/concurrency/thread_pool.cpp',
'mongo/util/concurrency/vars.cpp',
'mongo/util/debug_util.cpp',
'mongo/util/stacktrace.cpp',
'mongo/util/file_allocator.cpp',
'mongo/util/histogram.cpp',
'mongo/util/intrusive_counter.cpp',

View File

@ -72,7 +72,8 @@ commonFiles = [ "pch.cpp",
"s/shardconnection.cpp"]
env.StaticLibrary('mongocommon', commonFiles,
LIBDEPS=['$BUILD_DIR/third_party/pcrecpp',
LIBDEPS=['stacktrace',
'$BUILD_DIR/third_party/pcrecpp',
'$BUILD_DIR/third_party/murmurhash3/murmurhash3',
'$BUILD_DIR/third_party/mongo_boost'],)
@ -262,6 +263,8 @@ serverOnlyFiles = [ "db/curop.cpp",
env.Library( "dbcmdline", "db/cmdline.cpp" )
env.Library('stacktrace', 'util/stacktrace.cpp')
serverOnlyFiles += mmapFiles
serverOnlyFiles += [ "db/stats/snapshots.cpp" ]

View File

@ -19,8 +19,10 @@
#pragma once
#include <boost/detail/endian.hpp>
#include "concurrency/mutex.h"
#include "../bson/util/misc.h"
#include "mongo/bson/util/misc.h"
#include "mongo/util/concurrency/mutex.h"
#include "mongo/util/stacktrace.h"
namespace mongo {
@ -41,40 +43,6 @@ namespace mongo {
return s.str();
}
#if !defined(_WIN32) && !defined(NOEXECINFO) && !defined(__freebsd__) && !defined(__openbsd__) && !defined(__sun__)
} // namespace mongo
#include <pthread.h>
#include <execinfo.h>
namespace mongo {
inline pthread_t GetCurrentThreadId() {
return pthread_self();
}
/* use "addr2line -CFe <exe>" to parse. */
inline void printStackTrace(ostream &o = cout) {
void *b[20];
int size = backtrace(b, 20);
for (int i = 0; i < size; i++)
o << hex << b[i] << dec << ' ';
o << endl;
char **strings;
strings = backtrace_symbols(b, size);
for (int i = 0; i < size; i++)
o << ' ' << strings[i] << '\n';
o.flush();
free (strings);
}
#else
inline void printStackTrace(ostream &o = cout) { }
#endif
bool isPrime(int n);
int nextPrime(int n);

View File

@ -26,7 +26,7 @@
#include <unistd.h>
#endif
#if !defined(_WIN32) && !defined(NOEXECINFO)
#ifdef MONGO_HAVE_EXECINFO_BACKTRACE
#include <execinfo.h>
#endif
@ -84,7 +84,7 @@ namespace mongo {
static void formattedBacktrace( int fd ) {
#if !defined(_WIN32) && !defined(NOEXECINFO)
#ifdef MONGO_HAVE_EXECINFO_BACKTRACE
int numFrames;
const int MAX_DEPTH = 20;

View File

@ -0,0 +1,37 @@
// Copyright 2009. 10gen, Inc.
#include "mongo/util/stacktrace.h"
#include <cstdlib>
#include <iostream>
#ifdef MONGO_HAVE_EXECINFO_BACKTRACE
#include <execinfo.h>
static const int maxBackTraceFrames = 20;
void ::mongo::printStackTrace( std::ostream &os ) {
void *b[maxBackTraceFrames];
int size = ::backtrace( b, maxBackTraceFrames );
for ( int i = 0; i < size; i++ )
os << std::hex << b[i] << std::dec << ' ';
os << std::endl;
char **strings;
strings = ::backtrace_symbols( b, size );
for ( int i = 0; i < size; i++ )
os << ' ' << strings[i] << '\n';
os.flush();
::free( strings );
}
#else
void ::mongo::printStackTrace( std::ostream &os ) {}
#endif // defined(MONGO_HAVE_EXECINFO_BACKTRACE)

View File

@ -0,0 +1,16 @@
// Copyright 2009. 10gen, Inc.
/**
* Tools for working with in-process stack traces.
*/
#pragma once
#include <iostream>
namespace mongo {
// Print stack trace information to "os", default to std::cout.
void printStackTrace(std::ostream &os=std::cout);
} // namespace mongo