青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
金慶的專欄
C++博客
::
首頁
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評論 :: 0 Trackbacks
公告
我的隨筆
我的評論
我參與的隨筆
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網(wǎng)游開發(fā)(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊
公告照片
搜索
積分與排名
積分 - 662252
排名 - 25
最新評論
1.?re: boost::asio::spawn 將一統(tǒng)C++網(wǎng)絡(luò)庫
asio 成為C++首選網(wǎng)絡(luò)庫
--linda
2.?re: log4cxx中文輸出錯誤補丁
評論內(nèi)容較長,點擊標題查看
--金慶
3.?re: mingw編譯OrzNet
能發(fā)送一個mingw編譯好的OrzNet庫給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯誤補丁
評論內(nèi)容較長,點擊標題查看
--bigbad
5.?re: log4cxx中文輸出錯誤補丁
評論內(nèi)容較長,點擊標題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯誤(11075)
2.?SVN中邪惡的replace(11000)
3.?VS2005編譯libevent(10456)
4.?混音算法的學(xué)習與研究(10258)
5.?C調(diào)用lua腳本的效率測試(9025)
評論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯誤(18)
4.?C++引用優(yōu)于指針(17)
5.?ACE與ASIO之間關(guān)于Socket編程的比較(16)
查找內(nèi)存錯誤
查找內(nèi)存錯誤
(金慶的專欄 2019.12)
服務(wù)器進程有個偶發(fā)的崩潰,breakpad 上傳的 minidump 顯示調(diào)用棧不是出錯的代碼點,懷疑是內(nèi)存錯誤。
從日志分析可能觸發(fā)出錯的指令,然后在內(nèi)網(wǎng)調(diào)試環(huán)境下測試,很幸運地連續(xù)有幾次很容易重現(xiàn)了。
后來反復(fù)測試可知,發(fā)送某個特殊 GM 指令 200 次就會出現(xiàn)一次錯誤,一般會在 100 次內(nèi)出現(xiàn)。
但是以代碼反復(fù)執(zhí)行千次萬次都不能重現(xiàn),估計與時間有關(guān),需要手動操作延續(xù)一段時間后才會觸發(fā)。
出錯點多數(shù)在 `boost::property_tree::ini_parser::read_ini()` 中,如下:
```
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./GMServer.dbg'.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000010ca227 in tcmalloc::SLL_Next(void*) ()
Missing separate debuginfos, use: debuginfo-install glibc-2.17-105.el7.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc++-4.8.5-4.el7.x86_64 zlib-1.2.7-15.el7.x86_64
(gdb) bt
#0 0x00000000010ca227 in tcmalloc::SLL_Next(void*) ()
#1 0x00000000010ca2b8 in tcmalloc::SLL_TryPop(void**, void**) ()
#2 0x00000000010ca715 in tcmalloc::ThreadCache::FreeList::TryPop(void**) ()
#3 0x00000000011ebe6c in tc_newarray ()
#4 0x00007efddb7d4c69 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) () from /lib64/libstdc++.so.6
#5 0x0000000000a18153 in std::string::_S_construct<char*> (__beg=0x3f6c8b9 "LobbyServer]", __end=0x3f6c8c4 "]", __a=...) at /usr/include/c++/4.8.2/bits/basic_string.tcc:138
#6 0x00007efddb7d641c in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&, unsigned long, unsigned long) ()
from /lib64/libstdc++.so.6
#7 0x00007efddb7d6462 in std::string::substr(unsigned long, unsigned long) const () from /lib64/libstdc++.so.6
#8 0x0000000000a3c3be in boost::property_tree::ini_parser::read_ini<boost::property_tree::basic_ptree<std::string, std::string, std::less<std::string> > > (stream=..., pt=...)
at /var/tmp/src/f4f4f712-7894-4d98-83dd-b91be8e0555e/Linux-Debug/003_servers/../000_BaseLib/3RdParty/boost/include/boost/property_tree/ini_parser.hpp:111
#9 0x0000000000a3b2f0 in boost::property_tree::ini_parser::read_ini<boost::property_tree::basic_ptree<std::string, std::string, std::less<std::string> > > (
filehelp="cfg.ini", pt=..., loc=...)
at /var/tmp/src/f4f4f712-7894-4d98-83dd-b91be8e0555e/Linux-Debug/003_servers/../000_BaseLib/3RdParty/boost/include/boost/property_tree/ini_parser.hpp:169
...
#27 0x00007efddba27dc5 in start_thread () from /lib64/libpthread.so.0
#28 0x00007efddaf341cd in clone () from /lib64/libc.so.6
(gdb) q
```
但是 property_tree 是實踐證明可靠的庫,暫時不去懷疑它。
其他代碼有 uWS 處理HTTP 請求,用 hiredis 讀寫 Redis。
這些庫先假定是正確的,先查看自己的代碼,因為相關(guān)代碼較少,可以肉眼查錯,可惜只查到些無關(guān)的小錯誤。
然后到處添加調(diào)試日志,跟蹤變量的構(gòu)造與析構(gòu)。
因為 uWS 中用到了一個用戶自定義數(shù)據(jù),有一個 new/delete 操作,容易出內(nèi)存錯誤,重點就是這個數(shù)據(jù)是否存在野指針。
但是看上去正常。
肉眼查代碼不行,就要用工具了。
首先添加 -fstack-protector-all 編譯參數(shù),這個參數(shù)其實無論如何都應(yīng)該早就加上的,用來檢測函數(shù)調(diào)用時棧破壞。
同時在自定義用戶數(shù)據(jù)使用和析構(gòu)時檢查自身數(shù)據(jù)是否有效,如某個成員變量總是設(shè)為 0x5a, 析構(gòu)時才把它置為 0xcc.
崩潰依舊,但上述內(nèi)存檢查正常。
再使用一個 Address Sanitizer, 只需要添加編譯選項 -fsanitize=address 即可。
它用來檢查堆內(nèi)存是否存在非法操作。
但是這個不能和 tcmalloc 共用,我需要更改現(xiàn)有代碼,然后鏈接 asan 庫,終于可以運行起來了。
如果存在 tcmalloc 調(diào)用,進程啟動時就會崩潰。
效果很好,準確報告 "double-free" 錯誤:
```
[jinqing@host-192-168-21-31 bin]$ gdb GMServer.dbg
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg...done.
(gdb) r
Starting program: /home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
iLogLevel:1
[New Thread 0x7ffff3724700 (LWP 1010)]
[New Thread 0x7ffff2c1d700 (LWP 1011)]
[New Thread 0x7ffff2116700 (LWP 1012)]
[New Thread 0x7ffff160f700 (LWP 1013)]
[New Thread 0x7ffff0b08700 (LWP 1014)]
=================================================================
==1005== ERROR: AddressSanitizer: attempting double-free on 0x6004000270d0:
#0 0x7ffff4e60dd9 (/usr/lib64/libasan.so.0.0.0+0x15dd9)
#1 0x1570e8d (/home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg+0x1570e8 d)
0x6004000270d0 is located 0 bytes inside of 5-byte region [0x6004000270d0,0x6004 000270d5)
freed by thread T0 here:
#0 0x7ffff4e60dd9 (/usr/lib64/libasan.so.0.0.0+0x15dd9)
#1 0x1570e8d (/home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg+0x1570e8 d)
previously allocated by thread T0 here:
#0 0x7ffff4e60ef9 (/usr/lib64/libasan.so.0.0.0+0x15ef9)
#1 0x157179e (/home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg+0x157179 e)
Thread T4 created by T0 here:
#0 0x7ffff4e55a0a (/usr/lib64/libasan.so.0.0.0+0xaa0a)
#1 0x13fc796 (/home/jinqing/valkyrie/Runtime_ZT_QA/bin/GMServer.dbg+0x13fc79 6)
==1005== ABORTING
[Thread 0x7ffff160f700 (LWP 1013) exited]
[Thread 0x7ffff2116700 (LWP 1012) exited]
[Thread 0x7ffff2c1d700 (LWP 1011) exited]
[Thread 0x7ffff3724700 (LWP 1010) exited]
[Thread 0x7ffff7fe77c0 (LWP 1005) exited]
[Inferior 1 (process 1005) exited with code 01]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-105.el7.x86_64 li basan-4.8.5-39.el7.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc++-4.8.5-4.el7.x86_64 zlib-1.2.7-15.el7.x86_64
(gdb)
```
因為用了 gcc 4.8, 所以asan沒有函數(shù)名輸出,gcc 4.9 以上就會有函數(shù)名了。
但是不要緊,用 nm 可以搜到函數(shù)名:
```
[jinqing@host-192-168-21-31 bin]$ nm GMServer.dbg | grep 1570e
0000000001570e50 T freeReplyObject
0000000001570ef0 T redisReaderFree
[jinqing@host-192-168-21-31 bin]$ nm GMServer.dbg | grep 15717
0000000001571750 t createStringObject
[jinqing@host-192-168-21-31 bin]$ nm GMServer.dbg | grep 13fc7
00000000013fc700 t _ZN5boost6detail23set_current_thread_dataEPNS0_16thread_data_baseE
00000000013fc7d0 T _ZN5boost6thread21start_thread_noexceptERKNS_17thread_attributesE
00000000013fc750 T _ZN5boost6thread21start_thread_noexceptEv
00000000013fc740 T _ZN5boost6threadC1Ev
00000000013fc740 T _ZN5boost6threadC2Ev
[jinqing@host-192-168-21-31 bin]$ ^C
```
顯示為 freeReplyObject() 調(diào)用為 "double-free".
有了這個提示,查代碼就簡單了。原來查 uWS 的用戶數(shù)據(jù) new/delete 是方向性錯誤,
Redis 也有個 delete 操作,即返回的 ReplyObject 需要調(diào)用 freeReplyObject().
直接搜索一遍就找到了那個多余的 freeReplyObject.
原來是 ReplyObject 保存為一個成員變量,每次 Redis 操作完成后需要調(diào)用 freeReplyObject() 并將該成員設(shè)為空。
同時析構(gòu)函數(shù)中也會判斷該成員,非空則調(diào)用 freeReplyObject().
但是有個每 60s 執(zhí)行一次的 Ping 操作,調(diào)用了 freeReplyObject(), 但是沒有置空。
同時 GM 指令也觸發(fā)了一次 Redis 對象重置,再次調(diào)用了 freeReplyObject()。
正確的做法是不用成員變量,每次都用臨時變量就行了,但是用成員變量可以少寫一行聲明,寫代碼較方便。
為了少改代碼,仍然保持為成員變量,僅把缺的置空補上了。
同時析構(gòu)中的 freeReplyObject() 是沒必要的,改成斷言成員為空。
添了一行代碼,然后測試,發(fā)現(xiàn)錯誤不出現(xiàn)了。如果不加這行置空,將 Ping 間隔縮小,結(jié)果出錯概率大大增加了。
由此確認,錯誤點已找到并修正了。
posted on 2019-12-16 18:03
金慶
閱讀(2312)
評論(0)
編輯
收藏
引用
所屬分類:
1. C/C++
只有注冊用戶
登錄
后才能發(fā)表評論。
相關(guān)文章:
How are dtLinks created in NavMesh
C++ parameter passing rules
Naming Conventions for Accessors
Visual Studio 2019 Compiler Hangs
Fbx File Format Identifier
查找內(nèi)存錯誤
std::thread 中的異常會丟失調(diào)用棧
用賦值代替 protobuf CopyFrom()
vs2017 linux 編譯輸出改成 vs 格式
為 LiteIDE 添加選中標記
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产精品免费福利
|
久久久欧美精品sm网站
|
欧美日本一区二区视频在线观看
|
亚洲字幕一区二区
|
亚洲一区国产视频
|
午夜在线a亚洲v天堂网2018
|
亚洲欧美国产77777
|
午夜精品电影
|
久久久久.com
|
欧美激情欧美狂野欧美精品
|
欧美区一区二
|
国产日韩一级二级三级
|
亚洲第一区中文99精品
|
亚洲免费av网站
|
午夜精品在线看
|
免费欧美日韩
|
9i看片成人免费高清
|
午夜国产精品视频
|
免费成人黄色av
|
国产精品久久久久免费a∨大胸
|
国产精品亚洲综合一区在线观看
|
国内精品免费午夜毛片
|
9国产精品视频
|
久久激情网站
|
亚洲精品视频在线观看网站
|
亚洲一区二区三区免费在线观看
|
亚洲欧美在线视频观看
|
女人香蕉久久**毛片精品
|
亚洲免费电影在线
|
久久久久天天天天
|
国产精品乱码妇女bbbb
|
在线免费一区三区
|
欧美一区二区三区日韩
|
亚洲国产午夜
|
亚洲私人影院
|
欧美日本一区二区三区
|
亚洲国产aⅴ天堂久久
|
久久精品一区二区三区中文字幕
|
亚洲电影免费在线
|
欧美激情视频在线免费观看 欧美视频免费一
|
日韩亚洲欧美在线观看
|
久久午夜电影网
|
亚洲欧美精品在线观看
|
欧美日韩综合
|
在线一区观看
|
亚洲欧洲一区二区三区
|
午夜免费日韩视频
|
亚洲伊人伊色伊影伊综合网
|
亚洲精品日韩久久
|
久久久噜噜噜久久中文字幕色伊伊
|
亚洲毛片视频
|
欧美国产亚洲视频
|
亚洲国产精品悠悠久久琪琪
|
久久精品国产清自在天天线
|
亚洲一区在线直播
|
国产精品久久久久久久久
|
夜夜嗨av一区二区三区网站四季av
|
免费av成人在线
|
久久久亚洲综合
|
亚洲国产精品电影在线观看
|
久久久免费精品视频
|
欧美一级久久久久久久大片
|
国产精品久久久一区麻豆最新章节
|
免费欧美日韩
|
亚洲欧洲一区二区三区在线观看
|
欧美成人精品三级在线观看
|
久久久久久久久久久一区
|
欧美aaa级
|
91久久国产自产拍夜夜嗨
|
欧美成人国产一区二区
|
免费成人你懂的
|
中日韩美女免费视频网址在线观看
|
午夜日韩福利
|
性久久久久久久久
|
精品成人国产
|
欧美xxxx在线观看
|
欧美日本在线
|
久久精品亚洲精品国产欧美kt∨
|
久久成人精品视频
|
国内精品模特av私拍在线观看
|
美女久久一区
|
亚洲一区免费网站
|
午夜影视日本亚洲欧洲精品
|
亚洲欧美成人
|
国产在线视频不卡二
|
久久久久久亚洲精品中文字幕
|
榴莲视频成人在线观看
|
好吊色欧美一区二区三区四区
|
性xx色xx综合久久久xx
|
欧美高清视频免费观看
|
午夜精品福利一区二区蜜股av
|
亚洲精品一级
|
国产精品日韩一区二区
|
久久成人亚洲
|
亚洲美女网站
|
欧美顶级少妇做爰
|
国产综合色产在线精品
|
一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视
|
亚洲国产一区二区三区高清
|
欧美日韩精品一区二区
|
久久久精品国产99久久精品芒果
|
看欧美日韩国产
|
亚洲欧美美女
|
免费在线亚洲
|
久久精品国产99精品国产亚洲性色
|
久久99在线观看
|
在线午夜精品自拍
|
久久综合给合
|
欧美亚洲免费高清在线观看
|
欧美v国产在线一区二区三区
|
性伦欧美刺激片在线观看
|
欧美激情综合色
|
欧美1区2区3区
|
国产日韩欧美电影在线观看
|
亚洲精品国产精品国自产在线
|
很黄很黄激情成人
|
午夜在线电影亚洲一区
|
亚洲一区二区精品在线观看
|
欧美xxx成人
|
欧美激情一区二区三区四区
|
国产一区二区三区不卡在线观看
|
一卡二卡3卡四卡高清精品视频
|
亚洲国产一区在线
|
久久综合亚洲社区
|
欧美成人精品在线观看
|
依依成人综合视频
|
欧美一区二区三区视频在线观看
|
亚洲欧美激情一区二区
|
欧美日韩国产成人在线观看
|
欧美77777
|
亚洲激情成人在线
|
久久人人超碰
|
欧美成人午夜激情
|
亚洲国产精品精华液网站
|
久久国产欧美精品
|
久久视频精品在线
|
黄色成人av
|
久久综合免费视频影院
|
免费在线观看日韩欧美
|
在线观看成人av
|
欧美jizz19hd性欧美
|
亚洲国产免费
|
99成人免费视频
|
欧美少妇一区二区
|
亚洲一区国产精品
|
久久影院午夜论
|
欧美在线一二三区
|
国产精品久久一卡二卡
|
一区二区三区免费观看
|
亚洲视频碰碰
|
国产农村妇女毛片精品久久麻豆
|
亚洲欧美福利一区二区
|
久久成人羞羞网站
|
亚洲高清免费视频
|
欧美另类videos死尸
|
一区二区三区福利
|
久久国产一区二区三区
|
国语对白精品一区二区
|
蜜桃av综合
|
一个色综合导航
|
久久精品综合网
|
亚洲精品国产日韩
|
国产精品草草
|
久久久91精品国产一区二区精品
|
欧美激情精品
|
亚洲午夜在线观看
|
狠狠色伊人亚洲综合成人
|
看欧美日韩国产
|
亚洲午夜av电影
|
欧美gay视频
|
午夜视频在线观看一区二区
|
精品91久久久久
|
国产精品福利在线观看
|
久久久噜噜噜久噜久久
|
亚洲免费观看
|
老鸭窝亚洲一区二区三区
|
一区二区激情视频
|
伊人色综合久久天天
|
国产精品久久久久久影视
|
六十路精品视频
|
午夜精品偷拍
|
亚洲日本成人女熟在线观看
|
久久久久国产精品麻豆ai换脸
|
亚洲精品在线免费
|
国模精品一区二区三区
|
欧美视频精品在线
|
免费日韩av片
|
欧美在线观看一区
|
99综合在线
|
亚洲国产天堂久久综合网
|
久久精品国产久精国产一老狼
|
在线中文字幕不卡
|
91久久黄色
|
一区二区在线免费观看
|
国产乱码精品1区2区3区
|
欧美日韩精品伦理作品在线免费观看
|
国产精品久久久久影院亚瑟
|
欧美激情一区二区三区在线视频观看
|
性欧美video另类hd性玩具
|
亚洲人永久免费
|