| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | //  (C) Copyright Gennadiy Rozental 2001.//  Distributed under the Boost Software License, Version 1.0.//  (See accompanying file LICENSE_1_0.txt or copy at//  http://www.boost.org/LICENSE_1_0.txt)//  See http://www.boost.org/libs/test for the library home page.////! @file//! @brief defines portable debug interfaces//!//! Intended to standardize interface of programs with debuggers// ***************************************************************************#ifndef BOOST_TEST_DEBUG_API_HPP_112006GER#define BOOST_TEST_DEBUG_API_HPP_112006GER// Boost.Test#include <boost/test/detail/config.hpp>#include <boost/test/utils/basic_cstring/basic_cstring.hpp>// Boost#include <boost/function/function1.hpp>// STL#include <string>#include <boost/test/detail/suppress_warnings.hpp>//____________________________________________________________________________//namespace boost {/// Contains debugger and debug C Runtime interfacesnamespace debug {/// @defgroup DebuggerInterface Debugger and debug C Runtime portable interfaces/// @{/// These interfaces are intended to be used by application to:/// - check if we are running under debugger/// - attach the debugger to itself////// Unfortunately these actions differ widely between different debuggers available in a field. These interface present generalized standard form of/// performing these actions. Implementation depends a lot on the environment application is running in and thus there are several custom implementations/// supported by the Boost.Test////// In addition here you find interfaces for memory leaks detection and reporting.////// All these interfaces are defined in namespace boost::debug// ************************************************************************** ///// Checks if programs runs under debugger/// @returns true if current process is under debugger. False otherwise// ************************************************************************** //bool BOOST_TEST_DECL under_debugger();// ************************************************************************** ///// Cause program to break execution in debugger at call point// ************************************************************************** //void BOOST_TEST_DECL debugger_break();// ************************************************************************** ///// Collection of data, which is used by debugger starter routine// ************************************************************************** //struct dbg_startup_info {    long                    pid;                ///< pid of a program to attach to    bool                    break_or_continue;  ///< what to do after debugger is attached    unit_test::const_string binary_path;        ///< path to executable for current process    unit_test::const_string display;            ///< if debugger has a GUI, which display to use (on UNIX)    unit_test::const_string init_done_lock;     ///< path to a uniquely named lock file, which is used to pause current application while debugger is being initialized};/// Signature of debugger starter routine. Takes an instance of dbg_startup_into as only argumenttypedef boost::function<void (dbg_startup_info const&)> dbg_starter;// ************************************************************************** ///// Specifies which debugger to use when attaching and optionally what routine to use to start that debugger/// There are  many different debuggers available for different platforms. Some of them also can be used in a different setups/configuratins./// For example, gdb can be used in plain text mode, inside ddd, inside (x)emacs or in a separate xterm window./// Boost.Test identifies each configuration with unique string./// Also different debuggers configurations require different routines which is specifically tailored to start that debugger configuration./// Boost.Test comes with set of predefined configuration names and corresponding routines for these configurations:///   - TODO////// You can use this routine to select which one of the predefined debugger configurations to use in which case you do not need to provide starter/// routine (the one provided by Boost.Test will be used). You can also use this routine to select your own debugger by providing unique configuration/// id and starter routine for this configuration.////// @param[in] dbg_id   Unique id for debugger configuration (for example, gdb)/// @param[in] s        Optional starter routine for selected configuration (use only you want to define your own configuration)/// @returns            Id of previously selected debugger configurationstd::string BOOST_TEST_DECL set_debugger( unit_test::const_string dbg_id, dbg_starter s = dbg_starter() );// ************************************************************************** ///// Attaches debugger to the current process/// Using  currently selected debugger, this routine attempts to attach the debugger to this process./// @param[in] break_or_continue tells what we wan to do after the debugger is attached. If true - process execution breaks///                              in the point in invocation of this function. Otherwise execution continues, but now it is///                              under the debugger/// @returns true if debugger successfully attached. False otherwise// ************************************************************************** //bool BOOST_TEST_DECL attach_debugger( bool break_or_continue = true );// ************************************************************************** ///// Switches on/off memory leaks detection/// On platforms where memory leak detection is possible inside of running application (at the moment this is only Windows family) you can/// switch this feature on and off using this interface. In addition you can specify the name of the file to write a report into. Otherwise/// the report is going to be generated in standard error stream./// @param[in] on_off boolean switch/// @param[in] report_file file, where the report should be directed to// ************************************************************************** //void BOOST_TEST_DECL detect_memory_leaks( bool on_off, unit_test::const_string report_file = unit_test::const_string() );// ************************************************************************** ///// Causes program to break execution in debugger at specific allocation point/// On some platforms/memory managers (at the moment only on Windows/Visual Studio) one can tell a C Runtime to break/// on specific memory allocation. This can be used in combination with memory leak detection (which reports leaked memory/// allocation number) to locate the place where leak initiated./// @param[in] mem_alloc_order_num Specific memory allocation number// ************************************************************************** //void BOOST_TEST_DECL break_memory_alloc( long mem_alloc_order_num );} // namespace debug/// @}} // namespace boost#include <boost/test/detail/enable_warnings.hpp>#endif
 |