亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

對于c++程序來說,以segment fault為代表的程序異常行為千奇百怪,沒有一套比較豐富的工具集去對付他們,在處理實際問題時就會顯得捉襟見肘。本文列舉幾種程序異常的定位方法。

子線程創建不出來

猜測:go的程序都能創建出子線程,但是c++的創建不出來,但是在 x86 可以,是不是什么 linux 系統限制?

Linux定位c++程序運行異常的經歷《實操》

 

解決方法:加錯誤日志進行調試(最 lower 辦法)

找到報錯點:

Linux定位c++程序運行異常的經歷《實操》

 

查詢 man 手冊,看看是不是能找到有幫助的東西:

man pthread_attr_setstacksize 

打印出解釋:

ERRORS        pthread_attr_setstacksize() can fail with the following error:   

EINVAL The stack size is less than PTHREAD_STACK_MIN (16384) bytes.

On some systems, pthread_attr_setstacksize() can fail with the error EINVAL if stacksize is not a multiple of the system page size. 

翻譯上面的話,可能會產生這個錯誤:

  • EINVAL 堆棧大小小于 PTHREAD_STACK_MIN(16384) 字節。
  • 在某些系統上,如果 stacksize 不是系統頁面大小的倍數, pthread_attr_setstacksize() 可能會失敗,并顯示錯誤 EINVAL

查詢 linux 報錯碼含義, 得知錯誤碼 22 果然和 man 手冊中說的一致,是參數有問題。

Linux定位c++程序運行異常的經歷《實操》

 

第一次嘗試:擴大線程棧到上面說的 16384 ,但還是報錯

Linux定位c++程序運行異常的經歷《實操》

 

根據經驗,查看最小頁大小,發現是 16k , 而 x86 架構是 4K ,原來用的 20K 是不對齊的,怪不得創建不出來線程。

Linux定位c++程序運行異常的經歷《實操》

 

依次嘗試, 最終發現 10*16K 子線程成功創建。

但是不準確,按其說法,應該是設置 PAGESIZE 的整數倍都行,懷疑其對最小值有要求。c++ 的頭文件在 /usr/include 目錄下面, PTHREAD_STACK_MIN 是一個常量,估計里面會有定義,嘗試查找

$ grep -rl PTHREAD_STACK_MIN *

bits/local_lim.h

pthread.h

還真讓我找到了, 根據英文注釋,至少要兩個 64K 作為線程棧,才能跑起一個線程。

Linux定位c++程序運行異常的經歷《實操》

 

我發現程序雖然正常運行,但是部分功能不正常,經過查看日志發現,有一個線程只執行了一半就卡住了。

經過查看日志可以定位出是哪個線程卡住,如果從日志看不出來也沒關系。可以使用 pstack 進程號 看一些進程堆棧。

查看進程 pid:

ps -ef |grep 進程名

使用 gdb 查看是否出現問題,兩個重要命令:

  1. gdb attach {pid} #查看正在運行程序的棧
  2. info thread #進入以后使用,查看線程信息

找到錯誤位置,出現了 fgets() 和 read() 函數,懷疑是此處出現問題。

Linux定位c++程序運行異常的經歷《實操》

 

懷疑 1:_LINE_LENGTH 1024 長度太短,接受命令返回之后超過了數組本身的長度,覆蓋了未知的內存。

這種情況我以前遇到過,表現應該是程序直接就崩潰了。

懷疑 2:執行命令的時候卡了,導致后面的程序沒有執行。

根據 gdb 打印出來的參數,執行 linux 命令進行測試,果然是卡在這了!

再次使用 pstree -p {pid} 查看,確實主線程,調用了 linux 命令卡住。

Linux定位c++程序運行異常的經歷《實操》

 

接下來解決卡命令的問題。

解決 1:加 timeout 處理空返回。下面是示例命令,并不是我使用的命令。

timeout 5 ls -al 

代表超過 5 秒返回。

解決 2:定位為什么這個 linux 命令會卡住。

strace ls -al 

直到解決為止。希望對大家也有幫助。哪里寫的不好大家可以評論區留言 大家一起學習交流一下

分享到:
標簽:定位 Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定