使用ThreadSanitizer執行緒檢查工具

2021-10-05 15:35:51 字數 1889 閱讀 7589

threadsantizier又叫tsan,是乙個檢測線程data race的c/c++工具,它整合在新版gcc和clang中,通過編譯時加-fsanitize=thread,可以在執行時檢測出data race的問題

threadsanitizer官網:

data race

data race是指多個執行緒在沒有正確加鎖的情況下,同時訪問同一塊資料,並且至少有乙個執行緒是寫操作,對資料的讀取和修改產生了競爭,從而導致各種不可預計的問題。

data race的問題非常難查,data race一旦發生,結果是不可預期的,也許直接就crash了,也許導致執行流程錯亂了,也許把記憶體破壞導致之後某個時刻突然crash了。

環境要求

linux x86_64,核心版本不要太舊。(經測試,公司舊的開發機linux核心是2.6.16是跑不了的,新的tlinux核心3.10.0可以)

gcc 4.8版本以上(clang也整合了,3.2版本以上)

官方示例

#include

#include

int global;

void

*thread1

(void

*x)void

*thread2

(void

*x)int

main()

上面的**在不加鎖的情況下,兩個執行緒同時去修改global變數,從而導致data race。使用gcc的-fsanitize=thread 編譯,執行

$ g++ ******_race.cc -fsanitize=thread -fpie -pie -g

$./a.out

warning: threadsanitizer: data race (pid=26327)

write of size 4 at 0x7f89554701d0 by thread t1:

#0 thread1(void*) ******_race.cc:8 (exe+0x000000006e66)

previous write of size 4 at 0x7f89554701d0 by thread t2:

#0 thread2(void*) ******_race.cc:13 (exe+0x000000006ed6)

thread t1 (tid=26328, running) created at:

#0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)

#1 main ******_race.cc:19 (exe+0x000000006f39)

thread t2 (tid=26329, running) created at:

#0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)

#1 main ******_race.cc:20 (exe+0x000000006f63)
threadsanitizer: reported 1 warnings

執行程式,如果發生data race,錯誤資訊會直接輸出出來。如果錯誤資訊比較多,重定向輸出流到檔案裡,慢慢分析:

$ ./a.out >result.txt 2>&1

關鍵要點

除了加-fsanitize=thread外,一定要加-fpie -pie。

-g 是為了能顯示檔名和行號。

如果分生成obj(-c)和link兩個步驟,每一步都加:thread -fpie -pie -g,並且在link的時候加-ltsan

只支援64位,最好指定編譯64位(-m64)

如果依賴其他靜態庫,其他靜態庫編譯時必須指定-fpic(如果不是請重編)

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...