On Fri, 2007-03-23 at 02:46 +0200, Peter Dimov wrote:
Yes, there are a bunch of assertions in sp_debug_hooks that attempt to catch
heap- and shared_ptr-related errors. Make sure you don't #define NDEBUG,
though.
If the asserts don't trigger, your problem might be deeper than a simple
invalid use of shared_ptr. If you post a backtrace/call stack of one of your
crashes, we may be able to help.
When I add the BOOST_SP_ENABLE_DEBUG_HOOKS to the compile flags for g++
I am getting a segmentation fault when the boost::format lines in my
code are executed. Yet when I compile without it I don't. Here is the
output from my project that is in development. It gives me a error from
the parser.
$ ./reader --file kernel32.dll
File to analyze was set to kernel32.dll.
Parser_Base::Cannot find /home/storri/src/libreader/config.xml
Exception throw in Parser_Base.cpp at line 37
Unable to find the default setup files for the system.
Starting the library using the default settings
Data_Object::setData - Filename = kernel32.dll (Ptr count = 3,
Input Ptr count = 3)
Exception throw in Master_Formula_Parser.cpp at line 132
Exception:(Parsing_Exception) 3
Internal parsing error
When I compile it with BOOST_SP_ENABLE_DEBUG_HOOKS it fails with the
segfault:
$ ./reader --file kernel32.dll
File to analyze was set to kernel32.dll.
Parser_Base::Cannot find /home/storri/src/libreader/config.xml
Segmentation fault
(gdb) bt
#0 0x48029fa8 in std::operator<< () from /usr/lib/libstdc++.so.6
#1 0x0039cc7e in boost::io::detail::put_last (os=@0xbfa89674, x=@0x44584d)
at /usr/include/boost/format/feed_args.hpp:98
#2 0x0039cdaa in boost::io::detail::put (
x=@0x44584d, specs=@0x9969e48, res=@0x9969e4c, buf=@0xbfa89938, loc_p=0x0)
at /usr/include/boost/format/feed_args.hpp:150
#3 0x0039d549 in boost::io::detail::distribute (
self=@0xbfa89900, x=@0x44584d) at /usr/include/boost/format/feed_args.hpp:241
#4 0x0039d5a8 in boost::io::detail::feed (
self=@0xbfa89900, x=@0x44584d) at /usr/include/boost/format/feed_args.hpp:251
#5 0x0039d66e in boost::basic_format::operator% (
this=0xbfa89900, x=@0x44584d) at /usr/include/boost/format/format_class.hpp:64
#6 0x0039c06e in libreader::infrastructure::Parser_Base::parse_impl (this=0xbfa89bbc, file_ref=@0xbfa89b8c)
at Parser_Base.cpp:38
#7 0x0038d750 in libreader::infrastructure::Configuration_Parser::parse (this=0xbfa89bbc) at Configuration_Parser.cpp:31
#8 0x003914fe in libreader::infrastructure::Configurator::Instance () at Configurator.cpp:31
#9 0x0042f869 in libreader::infrastructure::Data_Source_Factory::Instance () at Data_Source_Factory.cpp:143
#10 0x0037af5b in Component (this=0x99684c0, id=0) at Component.cpp:37
#11 0x00377901 in Null_Component (this=0x99684c0, id=0) at Null_Component.cpp:16
#12 0x00374e2a in libreader::infrastructure::Component_Factory::get_Null_Component (this=0x9968458, id=0)
at Component_Factory.cpp:83
#13 0x0035138e in libreader::api::reader::execute (this=0xbfa89fc7, target_file=@0x9968174, input_type=@0x806acac,
output_type=@0x806acf4) at reader.cpp:68
#14 0x0805559a in main (ac=3, av=0xbfa8a1c4) at reader.cpp:50
When I go to the code I see in Parser_Base.cpp at line a message that prints out above:
std::cerr << boost::format("Exception throw in %s at line %d")
% __FILE__
% __LINE__
<< std::endl;
__LINE__ is on line 37 in the file. The only change in the compile flags
from the pervious attempt was the flag to activate the code in
sp_debug_hooks.cpp that I included in the file. Any suggestions how I
can use the flag and the code to debug my original problem without
causing a new one?
Stephen