使用gdb調試內存重複釋放導致的malloc_error_break錯誤崩潰

目前使用Poco::Util::ServerApplication構建服務器application,根據Poco官方文檔自己擴展Poco::Net::TCPServerConnectionFactory,開啓服務器tcp綁定監聽。代碼片段如下:

Poco::Net::ServerSocket cServerSocket(1300);
FxTcpConnectionFactory cFactory ("127.0.0.1"); 
Poco::Net::TCPServer cServer(&cFactory,cServerSocket);
cServer.start();

代碼運行正常,可以正常監聽到客戶端連接,有一次在終端命令行直接用ctr+c結束進程,結果在服務器結束後給出一段崩潰提示。

ServerMaind(47292,0x7fff76465180) malloc: *** error for object 0x7fff5fbff6e8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

字面上意思是被釋放的指針未分配有效內存地址,這是典型的重複釋放內存的問題。請出google大神,發現大部分是給出了xcode下如何設置malloc_error_break 符號,我用的是codelite,並不適用,不管他們了,直接進入執行程序所在目錄,執行gdb調試命令:

$gdb ./ServerMaind // 開始調試該程序

(gdb) b malloc_error_break // 設置malloc_error_break

(gdb) r // 在調試器中運行ServerMaind,又出同樣的錯誤了,已經被gdb捕捉到了,object 0x7fff5fbff6e8 釋放不正常

(gdb) backtrace // 調出崩潰現場的程序調用堆棧

#0  0x00007fff8e58c5b8 in malloc_error_break ()
#1  0x00007fff8e58d972 in free ()
#2  0x0000000100028ca8 in FxTcpConnectionFactory::~FxTcpConnectionFactory (this=0x7fff5fbff6e8) at FxTcpConnectionFactory.cpp:19
#3  0x000000010002afea in Poco::ReleasePolicy<Poco::Net::TCPServerConnectionFactory>::release (pObj=0x7fff5fbff6e8) at SharedPtr.h:90
#4  0x000000010002c9bc in Poco::SharedPtr<Poco::Net::TCPServerConnectionFactory, Poco::ReferenceCounter, Poco::ReleasePolicy<Poco::Net::TCPServerConnectionFactory> >::release (this=0x100e0bc80) at SharedPtr.h:404
#5  0x000000010002ca1e in Poco::SharedPtr<Poco::Net::TCPServerConnectionFactory, Poco::ReferenceCounter, Poco::ReleasePolicy<Poco::Net::TCPServerConnectionFactory> >::~SharedPtr (this=0x100e0bc80) at SharedPtr.h:159
#6  0x00000001001feeb0 in Poco::Net::TCPServerDispatcher::~TCPServerDispatcher (this=0x100e0bb70) at TCPServerDispatcher.cpp:99
#7  0x00000001001fe3bb in Poco::Net::TCPServerDispatcher::release (this=0x100e0bb70) at TCPServerDispatcher.cpp:115
#8  0x00000001001f234b in Poco::Net::TCPServer::~TCPServer (this=0x7fff5fbff648) at TCPServer.cpp:74
#9  0x0000000100029c23 in FxTcpServerMng::main (this=0x100e09aa0, args=@0x100e09ae0) at FxTcpServerMng.cpp:134
#10 0x0000000100212938 in Poco::Util::Application::run (this=0x100e09aa0) at Application.cpp:307
#11 0x0000000100247c2a in Poco::Util::ServerApplication::run (this=0x100e09aa0) at ServerApplication.cpp:117
#12 0x0000000100247a5b in Poco::Util::ServerApplication::run (this=0x100e09aa0, argc=1, argv=0x7fff5fbffae8) at ServerApplication.cpp:628
#13 0x0000000100001497 in main (argc=1, argv=0x7fff5fbffae8) at main.cpp:15
(gdb)

罪魁禍首找到了,原來Poco::Net::TCPServerConnectionFactory用的是共享指針方式來管理內存,而我直接FxTcpConnectionFactory cFactory ("127.0.0.1"),超出作用域就自己釋放了,導致程序推出的時候重複釋放內存,程序改成如下:

Poco::Net::ServerSocket cServerSocket(1300);
FxTcpConnectionFactory pFactory = new  FxTcpConnectionFactory ("127.0.0.1"); 
Poco::Net::TCPServer cServer(pFactory,cServerSocket);
cServer.start();

再運行後退出,果然正常了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章