139 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | //  (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 interfaces
 | ||
|  | namespace 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 argument
 | ||
|  | typedef 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 configuration
 | ||
|  | std::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
 |