
On 04/16/2013 03:11 PM, Andrey Semashev wrote:
On Tuesday 16 April 2013 11:55:53 Jason wrote:
I'm working from SVN trunk revision 83923. I've been experiencing segfaults when trying to set up a file sink that has date/time format specifiers in its file name. I thought I was doing something wrong, but I found that the "rotating_file" example also illustrates the same behavior. Here is a sample backtrace:
Looking at the disassembly of where the segfault happens, it seems to have gone off the rails and is executing invalid code. Specifically, the function pointer "converter" inside the date_time::microsec_clock<>:create_time() function seems to be invalid. Any ideas? I'm using gcc 4.7.2 on Ubuntu 12.10. I have the same setup and the rotating_file example runs fine for me (I tried with revision 83930 though). What compiler switches do you use?
(std::locale const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #3 0x00007ffff753c3e5 in boost::filesystem::path::parent_path() const () from /home/jasonr/gbot2/cfg/../packages/env/lib/libboost_filesystem.so.1.54.0 #4 0x00007ffff72e03b6 in boost::log::v2_mt_posix::sinks::(anonymous namespace)::file_collector::store_file(boost::filesystem::path const&) () from /home/jasonr/gbot2/cfg/../packages/env/lib/libboost_log.so.1.54.0 #5 0x00007ffff72df906 in boost::log::v2_mt_posix::sinks::text_file_backend::~text_file_backend() () from /home/jasonr/gbot2/cfg/../packages/env/lib/libboost_log.so.1.54.0 #6 0x00000000004cb189 in destroy (this=0x98f598) at /code/env/include/boost/smart_ptr/make_shared_object.hpp:57 #7 destroy (this=0x98f598) at /code/env/include/boost/smart_ptr/detail/sp_counted_impl.hpp:151 #8 operator() (this=0x98f598) at /code/env/include/boost/smart_ptr/make_shared_object.hpp:87 #9 boost::detail::sp_counted_impl_pd<boost::log::v2_mt_posix::sinks::text_file_backend*, boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sinks::text_file_backend> ::dispose (this=0x98f580) at /code/env/include/boost/smart_ptr/detail/sp_counted_impl.hpp:153 #10 0x00000000004d337a in release (this=0x98f580) at /code/env/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146 #11 ~shared_count (this=0x98f2b8, __in_chrg=<optimized out>) at /code/env/include/boost/smart_ptr/detail/shared_count.hpp:371 #12 ~shared_ptr (this=0x98f2b0, __in_chrg=<optimized out>) at /code/env/include/boost/smart_ptr/shared_ptr.hpp:328 #13 boost::log::v2_mt_posix::sinks::asynchronous_sink<boost::log::v2_mt_posix::sinks::text_file_backend, boost::log::v2_mt_posix::sinks::unbounded_fifo_queue>::~asynchronous_sink (this=0x98f1c0, __in_chrg=<optimized out>) at /code/env/include/boost/log/sinks/async_frontend.hpp:267 #14 0x00000000004d3429 in boost::log::v2_mt_posix::sinks::asynchronous_sink<boost::log::v2_mt_posix::sinks::text_file_backend, boost::log::v2_mt_posix::sinks::unbounded_fifo_queue>::~asynchronous_sink (this=0x98f1c0, __in_chrg=<optimized out>) at /code/env/include/boost/log/sinks/async_frontend.hpp:267 #15 0x00007ffff72bea70 in boost::log::v2_mt_posix::core::~core() () from /home/jasonr/gbot2/cfg/../packages/env/lib/libboost_log.so.1.54.0 #16 0x00007ffff72c1e12 in boost::detail::sp_counted_impl_p<boost::log::v2_mt_posix::core>::dispose() () from /home/jasonr/gbot2/cfg/../packages/env/lib/libboost_log.so.1.54.0 #17 0x00000000004cc509 in release (this=0x78fdc0) at /code/env/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146 #18 ~shared_count (this=<optimized out>, __in_chrg=<optimized out>) at /code/env/include/boost/smart_ptr/detail/shared_count.hpp:371 #19 boost::shared_ptr<boost::log::v2_mt_posix::core>::~shared_ptr (this=<optimized out>, __in_chrg=<optimized out>) at /code/env/include/boost/smart_ptr/shared_ptr.hpp:328 #20 0x00007ffff2c98901 in __run_exit_handlers (status=0,
I think I found the problem. I'm using posix_time's extended-precision mode, where it provides resolution in nanoseconds instead of microseconds (enabled by defining the preprocessor symbol BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG). I had this symbol defined in my source code, but I did not define it when building Boost. I fixed that, and now the example runs successfully. Also, my program also is able to log messages. With that said, I'm now experiencing a segfault at shutdown. It appears down in the text_file_backend code: #0 0x0000000f00000000 in ?? () #1 0x00007ffff358c9cd in __dynamic_cast () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #2 0x00007ffff35d14cb in std::codecvt<wchar_t, char, __mbstate_t> const& std::use_facet<std::codecvt<wchar_t, char, __mbstate_t> listp=0x7ffff30156a8 <__exit_funcs>, run_list_atexit=true) at exit.c:78 #21 0x00007ffff2c98985 in __GI_exit (status=<optimized out>) at exit.c:100 #22 0x00007ffff2c7e774 in __libc_start_main (main=0x42f630 <main(int, char**)>, argc=1, ubp_av=0x7fffffffe148, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe138) at libc-start.c:258 #23 0x0000000000431481 in _start () However, I don't see this problem with any examples that I've tried, so it's not clear to me where the problem is. The crash is down in boost::filesystem. I'm not sure whether it's trying to access some resource too late in the shutdown process or what. On a side note, I wanted to point out that Boost.Log looks fantastic. It may seem a bit complex at first, but the amount of flexibility and extensibility is well beyond any other logging facility I've seen before. Jason