后端開發時常要用到多線程。涉及多線程就可能發生死鎖,所以在給線程傳入參數時,檢查讀寫區域,是否被公用。如果有,可以加鎖,也可以指定一塊新的內存地址。
下面主要介紹下如何調試死鎖線程。主要采用pstack和gdb兩個工具。
1.pstack 是 Linux(比如 Red Hat Linux 系統、Ubuntu Linux 系統等)下一個很有用的工具,它的功能是打印輸出此進程的堆棧信息。可以輸出所有線程的調用關系棧。
2.GDB 是 GNU 開源組織發布的一個強大的 UNIX 下的程序調試工具。Linux 系統中包含了 GNU 調試程序 gdb,它是一個用來調試 C 和 C++ 程序的調試器。可以使程序開發者在程序運行時觀察程序的內部結構和內存的使用情況 .
調試流程如下
- 查找程序的進程號
ps -ef|grep Process_Name
2.打印進程的堆棧信息
pstack Process_NO
- 多次執行上述命令,比較哪幾個線程有共同的函數入口,再比較傳入參數地址。
- 找到是哪個線程死鎖之后,再啟動gdb
gdb
- 啟動之后,attach到死鎖進程
attach Process_NO
- 查看進程堆棧信息
info thread
- 剛才我們已經初步定位了死鎖的線程,現在切換到該線程
thread NO
- 進入到線程后,再查看線程棧信息
backtrace
- 切換到另一個線程,查看棧信息
thread NO_2
反復比較,能夠看出,具體是哪一塊內存觸發死鎖。