欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Linux中如何定位c++程序運行異常

這篇文章將為大家詳細講解有關Linux中如何定位c++程序運行異常,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了瑪曲免費建站歡迎大家使用!

我遇到了一些棘手的問題,因為在mips64上編譯程序,經(jīng)常出現(xiàn)程序編譯不出來,或者運行不正常,花了很長的時間定位,最后和同事一些解決了,下面分享出來我提煉出來的一些核心定位問題的步驟。

子線程創(chuàng)建不出來

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

Linux中如何定位c++程序運行異常

正常表現(xiàn)

Linux中如何定位c++程序運行異常

異常表現(xiàn)

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

找到報錯點:

Linux中如何定位c++程序運行異常

錯誤日志內(nèi)容

查詢 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.

翻譯上面的話,可能會產(chǎn)生這個錯誤:

  • EINVAL 堆棧大小小于 PTHREAD_STACK_MIN(16384) 字節(jié)。

  • 在某些系統(tǒng)上,如果 stacksize 不是系統(tǒng)頁面大小的倍數(shù), pthread_attr_setstacksize() 可能會失敗,并顯示錯誤  EINVAL

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

Linux中如何定位c++程序運行異常

錯誤碼對照

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

Linux中如何定位c++程序運行異常

錯誤日志內(nèi)容

根據(jù)經(jīng)驗,查看最小頁大小,發(fā)現(xiàn)是 16k , 而 x86 架構是 4K ,原來用的 20K 是不對齊的,怪不得創(chuàng)建不出來線程。

Linux中如何定位c++程序運行異常

查看系統(tǒng)頁大小

依次嘗試, 最終發(fā)現(xiàn) 10*16K 子線程成功創(chuàng)建。

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

$ grep -rl PTHREAD_STACK_MIN * bits/local_lim.h pthread.h

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

Linux中如何定位c++程序運行異常

系統(tǒng)c++頭文件中的提示信息

至此問題解決。

部分線程卡住

我發(fā)現(xiàn)程序雖然正常運行,但是部分功能不正常,經(jīng)過查看日志發(fā)現(xiàn),有一個線程只執(zhí)行了一半就卡住了。

經(jīng)過查看日志可以定位出是哪個線程卡住,如果從日志看不出來也沒關系??梢允褂?pstack 進程號 看一些進程堆棧。

查看進程 pid:

ps -ef |grep 進程名

使用 gdb 查看是否出現(xiàn)問題,兩個重要命令:

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

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

Linux中如何定位c++程序運行異常

gdb attach命令結果

Linux中如何定位c++程序運行異常

錯誤代碼位置

懷疑 1:_LINE_LENGTH 1024 長度太短,接受命令返回值后超過了數(shù)組本身的長度,覆蓋了未知的內(nèi)存。

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

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

根據(jù) gdb 打印出來的參數(shù),執(zhí)行 linux 命令進行測試,果然是卡在這了!

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

Linux中如何定位c++程序運行異常

查看此進程的線程樹

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

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

timeout 5 ls -al

代表超過 5 秒返回。

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

strace ls -al

關于“Linux中如何定位c++程序運行異?!边@篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

當前文章:Linux中如何定位c++程序運行異常
文章轉載:http://chinadenli.net/article40/iegieo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、微信公眾號、標簽優(yōu)化網(wǎng)站建設、做網(wǎng)站小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
69老司机精品视频在线观看| 激情五月综五月综合网| 亚洲国产欧美精品久久| 精品欧美国产一二三区| 亚洲一区二区欧美激情| 中文字幕欧美视频二区| 人妻乱近亲奸中文字幕| 中国一区二区三区人妻| 千仞雪下面好爽好紧好湿全文| 高清国产日韩欧美熟女| 欧美日韩有码一二三区 | 久久精品国产熟女精品| 激情五月激情婷婷丁香| 日韩精品成区中文字幕| 久久午夜福利精品日韩| 大香蕉大香蕉手机在线视频| 嫩呦国产一区二区三区av| 99久久精品久久免费| 久久国产亚洲精品赲碰热| 中文字幕亚洲精品人妻| 东京热男人的天堂一二三区| 国产一级内射麻豆91| 国产一区二区在线免费| 高清一区二区三区不卡免费| 草草夜色精品国产噜噜竹菊| 欧美午夜不卡在线观看| 久久中文字人妻熟女小妇| 殴美女美女大码性淫生活在线播放| 国内精品伊人久久久av高清| 日本人妻熟女一区二区三区| 91日韩欧美中文字幕| 日本欧美视频在线观看免费 | 亚洲成人黄色一级大片| 五月婷婷欧美中文字幕| 国产免费无遮挡精品视频 | 人妻中文一区二区三区| 日韩欧美二区中文字幕| 九九久久精品久久久精品 | 日韩欧美国产精品中文字幕| 亚洲一区二区精品免费视频| 在线视频三区日本精品|