(gdb) f 0
#0 operator++ (this=)
at /opt/hisi-linux/x86-arm/arm-hisiv300-linux/arm-hisiv300-linux-uclibcgnueabi/include/c++/4.8.3/bits/stl_list.h:235
235 _m_node = _m_node->_m_next;
(gdb) p _m_node
dwarf error: cannot find die at 0x34e243f
宕機的根本原因是記憶體檢視了乙個不可訪問的位址。
在gdb下輸入如下的命令
(gdb) source stl-views-1.0.3.gdb
(gdb) plist m_queue
省略中間的列印結果,從列印結果看,list沒有為空的節點
這個時候就推測有沒有可能是多執行緒問題引入。
列印暫存器位址
(gdb) info r
r0 0x0 0
r1 0x0 0
r2 0x0 0
r3 0x180 384
r4 0x5f7b878 100120696
r5 0x727fcc8 120061128
r6 0x5f7b8b0 100120752
r7 0x655a0a8 106274984
r8 0x655a168 106275176
r9 0x5f7b8b4 100120756
r10 0x5f7b8a4 100120740
r11 0x3d1c1014 1025249300
r12 0x0 0
sp 0x3d1c0e90 0x3d1c0e90
lr 0x76f006ac 1995441836
pc 0x2a603c 0x2a603c
cpsr 0x80000010 -2147483632
從arm平台的暫存器作用我們可知,r0-r3是入參暫存器
檢視反彙編指令
0x002a6018 <+0>: push
0x002a601c <+4>: mov r4, r0
0x002a6020 <+8>: add r9, r0, #60 ; 0x3c
0x002a6024 <+12>: add r10, r0, #44 ; 0x2c
0x002a6028 <+16>: mov r0, r9
0x002a602c <+20>: bl 0xb89910
0x002a6030 <+24>: ldr r2, [r4, #44] ; 0x2c
0x002a6034 <+28>: mov r3, #0
0x002a6038 <+32>: cmp r2, r10
=> 0x002a603c <+36>: ldrne r2, [r2]
0x002a6040 <+40>: addne r3, r3, #1
從c++的編譯知識可以知道,this指標是函式的第乙個引數,而r0從r4賦值而來,到執行到宕機那一步的
時候r0的值變為0。而一般多執行緒宕機的情況下,才會出現暫存器和記憶體不一致的情況。
再看看**中還有**改變了m_queue的值。
bool recvmessage
{......
m_queue.size();
.......
發現有人修改了以前一處未加鎖的m_queue訪問。基本確定是多執行緒問題。
將上面的斷言去掉後,就解決了多執行緒的問題
從上面要了解到兩點, 第
一:stl標準庫的容器都是非執行緒安全,使用時要注意資料安全
第二:盡量採用raii的方法管理資料的序列訪問,避免有地方遺漏,造成執行緒不安全
List相關演算法
乙個快節點,乙個慢節點,如果有環,快節點一定會追上慢節點 definition for singly linked list.class listnode public class solution return false 將要刪除節點複製為下乙個節點,並刪除下乙個節點。definition fo...
list相關的函式
1 any list list 中任何乙個元素都有邏輯真,則返回 true,全為假返回 false all list list 中所有元素都為真時返回 true,否則返回 false 2 max list min list 返回列表中的最大值 或 最小值 3 enumerate 在列表中同時迴圈 索...
節點List相關操作
為方便遍歷子節點,lxml將節點list的操作盡可能的與python處理list的方式一樣保持一致 建立xml from lxml import etree root etree.element root 建立根節點 child1 建立子節點child1 child2 etree.subelemen...