Valgrind

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Valgrind

投稿記事 by h2so5 » 13年前

よく分からないSegfaultに悩まされていたので、Valgrindっていうデバッガを使ってみました。
new や delete をデバッグ用のものに置き換えてヒープを監視するタイプのものですね。

一発でSegfaultの原因が分かりました^^;

CODE:

==7988== Invalid read of size 4
==7988==    at 0x8075542: _ZZN7network6Server5StartESt8functionIFvNS_7CommandEEEENKUlS2_E_clES2_ (Server.cpp:53)
==7988==    by 0x8076799: _ZNSt17_Function_handlerIFvN7network7CommandEEZNS0_6Server5StartESt8functionIS2_EEUlS1_E_E9_M_invokeERKSt9_Any_dataS1_ (functional:1778)
==7988==    by 0x807C619: std::function::operator()(network::Command) const (functional:2161)
==7988==    by 0x80857AB: network::Session::FatalError() (Session.cpp:319)
==7988==    by 0x808564E: network::Session::Write(boost::system::error_code const&) (Session.cpp:299)
==7988==    by 0x8088B16: boost::_mfi::mf1::operator()(network::Session*, boost::system::error_code const&) const (mem_fn_template.hpp:165)
==7988==    by 0x8088517: void boost::_bi::list2, boost::arg (*)()>::operator(), boost::$
==7988==    by 0x8087C77: void boost::_bi::bind_t, boost::_bi::list2, boost::arg ($
==7988==    by 0x80871AE: boost::asio::detail::write_op >, boost::asio::const_buffers_1, bo$
==7988==    by 0x8089864: boost::asio::detail::binder2 >, boo$
==7988==    by 0x8089833: void boost::asio::asio_handler_invoke::~function() (functional:1877)
==7988==    by 0x808475A: network::Session::~Session() (Session.cpp:27)
==7988==    by 0x8080E73: network::Server::ServerSession::~ServerSession() (in /home/rainscape/mmo/server/bin/mmoserver)
==7988==    by 0x8080ED3: boost::detail::sp_ms_deleter::destroy() (make_shared.hpp:56)
==7988==    by 0x807FD1C: boost::detail::sp_ms_deleter::operator()(network::Server::ServerSession*) (make_shared.hpp:86)
==7988==    by 0x80842EF: boost::detail::sp_counted_impl_pd >::dispose() (sp_counted_impl.hpp:148)
==7988==    by 0x8055089: boost::detail::sp_counted_base::release() (sp_counted_base_gcc_x86.hpp:145)
==7988==    by 0x80550ED: boost::detail::shared_count::~shared_count() (shared_count.hpp:305)
std::functionのデストラクタで別のstd::functionと共有しているメモリを解放してしまっています。

コメントはまだありません。