Re: Question about singleton class design for tracing
On Wed, 23 May 2007 09:49:37 -0700, Noah Roberts wrote:
I don't see anything inherently wrong with the singleton aspect. Doesn't
mean there isn't one or that your use isn't causing a problem. I suggest
breaking out the debugger.
Breaking out the debugger leaves me confused. I changed the class so that Instance() returned a pointer to m_instance.
Here is a trace
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1208285488 (LWP 27865)]
0x48022d11 in std::num_put<char, std::ostreambuf_iterator<char,
std::char_traits<char> > >::_M_insert_int<long> () from /usr/lib/libstdc++.so.6
(gdb) bt
#0 0x48022d11 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long> () from /usr/lib/libstdc
+.so.6
#1 0x48022f90 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put () from /usr/lib/libstdc++.so.6
#2 0x4802b83d in std::ostream::operator<< () from /usr/lib/libstdc++.so.6
#3 0x0027729a in boost::io::detail::put_last<char, std::char_traits<char>, int> (os=@0xbfd13d04, x=@0xbfd13f8c) at /usr/
include/boost/format/feed_args.hpp:113
#4 0x00277561 in boost::io::detail::put<char, std::char_traits<char>, std::allocator<char>, int&> (
x=@0xbfd13f8c, specs=@0x8fdab14, res=@0x8fdab18, buf=@0xbfd13ff8, loc_p=0x0)
at /usr/include/boost/format/feed_args.hpp:167
#5 0x00277b65 in boost::io::detail::distribute<char, std::char_traits<char>, std::allocator<char>, int&> (
self=@0xbfd13fc0, x=@0xbfd13f8c) at /usr/include/boost/format/feed_args.hpp:241
#6 0x00277bc4 in boost::io::detail::feed<char, std::char_traits<char>, std::allocator<char>, int&> (
self=@0xbfd13fc0, x=@0xbfd13f8c) at /usr/include/boost/format/feed_args.hpp:251
#7 0x00277c8a in boost::basic_format<char, std::char_traits<char>, std::allocator<char> >::operator%<int> (
this=0xbfd13fc0, x=@0xbfd13f8c) at /usr/include/boost/format/format_class.hpp:68
#8 0x0026f300 in libreverse::trace::Trace_State::get_ID_String (this=0x8fda338) at Trace.cpp:80
#9 0x0026f68b in libreverse::trace::Trace_State::open_Trace_File (this=0x8fda338) at Trace.cpp:56
#10 0x0026f8ae in libreverse::trace::Trace_State::Trace_State (this=0x8fda338) at Trace.cpp:165
#11 0x0026f92b in libreverse::trace::Trace_State::Instance () at Trace.cpp:20
#12 0x0026f97e in libreverse::trace::Trace::write_Trace (level=50, message=@0xbfd14288) at Trace.cpp:181
#13 0x003a177c in libreverse::infrastructure::Memory_Data_Source_Config::Memory_Data_Source_Config
(this=0x8fda2d8) at Memory_Data_Source_Config.cpp:17
#14 0x002b8ccb in libreverse::infrastructure::Configuration_Data::Configuration_Data (this=0x8fda2b0)
at Configuration_Data.cpp:19
#15 0x002bf2da in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535)
at Configurator.cpp:24
#16 0x002bf34d in global constructors keyed to _ZN10libreverse14infrastructure12Configurator10m_instanceE ()
at Configurator.cpp:159
#17 0x003a4aa6 in __do_global_ctors_aux () from /usr/local/lib/libreverse.so.0
#18 0x002439f1 in _init () from /usr/local/lib/libreverse.so.0
#19 0x47ba1fc3 in call_init () from /lib/ld-linux.so.2
#20 0x47ba20d3 in _dl_init_internal () from /lib/ld-linux.so.2
#21 0x47b9490f in _dl_start_user () from /lib/ld-linux.so.2
If I look at Frame #8 in gdb
76 name << boost::format ( "%s_%02d:%02d:%02d" )
77 % boost::gregorian::to_iso_extended_string ( today )
78 % tm_ref.tm_hour
79 % tm_ref.tm_min
80 % tm_ref.tm_sec;
I see we are pointing to my call to boost::format. The variable 'today'
is a valid boost::gregorian::date object (0xbfd13fb0). As well as tm_ref:
(gdb) p tm_ref
$3 = {
tm_sec = 7,
tm_min = 53,
tm_hour = 11,
tm_mday = 23,
tm_mon = 4,
tm_year = 107,
tm_wday = 3,
tm_yday = 142,
tm_isdst = -1,
tm_gmtoff = -1076805688,
tm_zone = 0x480105c5 "\211???213E\b1???213"
}
The only thing that is suspect at this point is the Trace object itself:
(gdb) p *this
warning: RTTI symbol not found for class 'libreverse::trace::Trace_State'
$5 = warning: RTTI symbol not found for class 'libreverse::trace::Trace_State'
{
_vptr.Trace_State = 0x499570,
static m_instance = 0x0,
m_file_prefix = {
static npos = 4294967295,
_M_dataplus = {
<allocator<char>> = {
<new_allocator<char>> = {<No data fields>}, <No data fields>},
members of basic_string<char,std::char_traits<char>,std::allocator<char> >::_Alloc_hider:
_M_p = 0x8fda474 "Trace"
}
},
m_trace_level = 0,
m_log_stream = <incomplete type>
}
The variable m_instance is still null, which it should not be. I will investigate it some more.
Stephen