list相關宕機

2021-07-27 22:07:58 字數 2248 閱讀 4282

(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...