抓蟲記之九 都是執行緒惹的禍

2021-09-06 04:08:54 字數 773 閱讀 9869

在發生的時候,沒有丟擲異常現象,這樣的bug是很難進行跟蹤的。你只有通過各種方向的分析,調查,才能慢慢的找到。

這就好像,突然發現乙個屍體,你就得到失蹤人口裡去尋找,可是是否找得到,有時候可能就是運氣問題。

幸好,軟體不是現實,我們可以反覆的進行除錯。

同樣是上次案例的那個伺服器。有一段時間發現伺服器在自動化測試的時候,每跑到2個小時後,就會出現記憶體不足的問題。這肯定是出現記憶體洩露了。

我們有跟蹤tobject建立和釋放的鉤子,但卻發現沒有物件忘記釋放的情況。

而且在本地除錯,怎麼也出現不了這個情況。但一放到自動化測試環境中,就準會崩潰。

實在沒轍,只能跟蹤伺服器記憶體占用情況,發現挺奇怪的,每次都是5m的速度增長。

突然,我們的開發人員supper,靈機一動,他想到exceptlog就是會在異常的時候,申請5m,是不是是他。

看了一下**,這裡確實是申請了5m,但是有釋放的**啊。怎麼回事呢?

突然又想,會不會是伺服器的多執行緒導致的?

看了一下,記錄申請空間的變數,竟然是乙個全域性變數(不是執行緒區域性物件),那麼在多執行緒的時候,比如會出現,兩個物件同時建立,但在沒有釋放之前,其中乙個已經把另外乙個覆蓋掉了。

類似於下面的**:

oerrmemory := virtualallocmemory( … )

在高併發,長期執行的情況下,伺服器遲早會記憶體不足的。

後來修改了加上了互斥量,就沒這個問題了。我們往往經驗都在寫單執行緒系統,確實缺少寫多執行緒的經驗。最好的辦法,其實就是不要使用外部變數,只用函式自己的變數是最安全的。

抓蟲記之二 WSDL中消失的函式定義

還是那句老話,現象總是撲朔迷離。這次的現象更加奇怪,在乙個webservice的介面定義中,某個新定義的方法總是看不到。可是看了實現 確實已經公布了。這是為什麼呢?先說明一下實現環境,這個是在delphi環境下編寫webservice的。大家可能說visualstudio就不會有這樣的問題了,這個我...

抓蟲記之二 WSDL中消失的函式定義

還是那句老話,現象總是撲朔迷離。這次的現象更加奇怪,在乙個webservice的介面定義中,某個新定義的方法總是看不到。可是看了實現 確實已經公布了。這是為什麼呢?先說明一下實現環境,這個是在delphi環境下編寫webservice的。大家可能說visualstudio就不會有這樣的問題了,這個我...

抓包工具sniffer 九點之BLE抓包1

今年咱們聊聊抓取ble的空中包的環境。就是抓取藍芽在通訊中或廣播在大氣中的資料,這些資料分析分析則能更容易理解藍芽通訊協議!此方案實測已支援nordic,ti,csr,bk博通整合等ble方案的藍芽裝置。開發版 nrf52832開發版 軟體 1.wireshark的兩個配置檔案2.nrf52832 ...