// debug_util.h /* Copyright 2009 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #ifndef _WIN32 #include #endif // ndef _WIN32 namespace mongo { // for debugging typedef struct _Ints { int i[100]; } *Ints; typedef struct _Chars { char c[200]; } *Chars; typedef char CHARS[400]; typedef struct _OWS { int size; char type; char string[400]; } *OWS; // for now, running on win32 means development not production -- // use this to log things just there. #if defined(_WIN32) # define MONGO_WIN if( 1 ) #else # define MONGO_WIN if( 0 ) #endif #define WIN MONGO_WIN #if defined(_DEBUG) # define MONGO_DEV if( 1 ) #else # define MONGO_DEV if( 0 ) #endif #define DEV MONGO_DEV #define MONGO_DEBUGGING if( 0 ) #define DEBUGGING MONGO_DEBUGGING // The following declare one unique counter per enclosing function. // NOTE The implementation double-increments on a match, but we don't really care. #define MONGO_SOMETIMES( occasion, howOften ) for( static unsigned occasion = 0; ++occasion % howOften == 0; ) #define SOMETIMES MONGO_SOMETIMES #define MONGO_OCCASIONALLY SOMETIMES( occasionally, 16 ) #define OCCASIONALLY MONGO_OCCASIONALLY #define MONGO_RARELY SOMETIMES( rarely, 128 ) #define RARELY MONGO_RARELY #define MONGO_ONCE for( static bool undone = true; undone; undone = false ) #define ONCE MONGO_ONCE #if defined(_WIN32) #define MONGO_strcasecmp _stricmp #define strcasecmp MONGO_strcasecmp #endif // Sets SIGTRAP handler to launch GDB // Noop unless on *NIX and compiled with _DEBUG void setupSIGTRAPforGDB(); #if defined(_WIN32) inline void breakpoint() {} //noop #else // defined(_WIN32) // code to raise a breakpoint in GDB inline void breakpoint(){ ONCE { //prevent SIGTRAP from crashing the program if default action is specified and we are not in gdb struct sigaction current; sigaction(SIGTRAP, NULL, ¤t); if (current.sa_handler == SIG_DFL){ signal(SIGTRAP, SIG_IGN); } } raise(SIGTRAP); } #endif // defined(_WIN32) // conditional breakpoint inline void breakif(bool test){ if (test) breakpoint(); } } // namespace mongo