国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個QT程序無法啟動問題的分析與解決

這篇具有很好參考價值的文章主要介紹了一個QT程序無法啟動問題的分析與解決。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最近調(diào)試設(shè)備,遇到了一個奇怪的問題:QT程序無法重啟。

查看日志,發(fā)現(xiàn)報如下錯誤:

QLock::QLock: Cannot create semaphore /tmp/qtembedded-0/QtEmbedded-0 'd' (22, Invalid argument)
Cannot get display lock
Aborted

下面整理記錄問題的解決過程。

1 首先,說明程序之前奔潰了。
因為這是重啟過程中報的信息。后臺監(jiān)控發(fā)現(xiàn)程序奔潰后,會再次拉起。這個日志就是拉起過程中出現(xiàn)的。

2 先不管之前為啥崩潰了。我們看看程序為啥無法成功重啟。

3 是否是因為程序本身出了什么問題?
因為這個錯誤之前不曾見過,又因為之前出現(xiàn)過flash上的文件發(fā)生損壞的情況,所以猜測會不會是因為壞塊導(dǎo)致的執(zhí)行程序文件損壞。
通過將程序二進制文件拷貝出來以及將新的替換進去,驗證程序沒有發(fā)生變化,但是問題一直存在。
使用其他QT程序,問題也依然存在,所以程序本身的問題被排除

4 是否是因為QT基礎(chǔ)庫問題導(dǎo)致?
基本思路還是跟3中描述一樣,只不過這次懷疑是否是QT的基礎(chǔ)庫發(fā)生了變動。
如果基礎(chǔ)庫發(fā)生變動,那么所有QT程序都可能無法正常運行。
將設(shè)備上的QT相關(guān)庫拷貝出來,跟燒寫版本對比,發(fā)現(xiàn)基礎(chǔ)庫沒有變化。
重新替換QT基礎(chǔ)庫,問題仍然存在。

5 是否是因為QT運行環(huán)境問題導(dǎo)致?
拷貝異常設(shè)備中,root tmp等目錄下QT生成的文件,跟正常設(shè)備對比,發(fā)現(xiàn)沒有明顯的差異

6 查找錯誤日志所在代碼
既然前面幾個懷疑點都排除了,沒有明確的驗證方向的情況下,決定看看錯誤日志到底是那塊代碼打印的。
通過搜索QT程序和QT開發(fā)環(huán)境,發(fā)現(xiàn)Cannot get display lock這一句是QT基礎(chǔ)庫里的打印
進一步的,確定了代碼所在位置:qtapplication_qws.cpp.

跟蹤代碼,發(fā)現(xiàn)是qtlock初始化失敗了。
但是,相關(guān)的代碼有很多編譯選項,不確定錯誤到底是那個if else邏輯出來的。
考慮到整個QT自身的代碼比較龐大,搜索也不容易確定宏是否是打開狀態(tài),決定添加日志,跟蹤定位問題。

7 重新編譯QT庫
重新編譯QT庫后,將日志所在的GUI庫替換,重新跑程序來看:
?

   QLock::lock(): file name /tmp/qtembedded-0/QtEmbedded-0 id=d create=create 
   QLock::lock(): QT_POSIX_IPC 
   QLock::lock(): QT_POSIX_IPC 1 data id = -1 semkey=1678592551 (2, No such file or directory)
   QLock::lock(): QT_POSIX_IPC 2 data id = -1 semkey=1678592551, (28, No space left on device)
   QLock::lock(): QT_POSIX_IPC 3 data id = -1 arg.val=200, (22, Invalid argument)
   QLock::QLock: Cannot create semaphore /tmp/qtembedded-0/QtEmbedded-0 'd' (22, Invalid argument)
   Cannot get display lock
   Aborted

這是最后確定問題的日志,中間過程不再說明。
我們看到,走了IPC處理分支
關(guān)鍵錯誤在第四行,errno是28,說明沒有空間
這句日志對應(yīng)的代碼接口為semget

8 查看系統(tǒng)調(diào)用說明
man semget,查看這個系統(tǒng)調(diào)用的使用說明。
其中有關(guān)于28錯誤的說明,ENOSPC,基本是說創(chuàng)建信號量時,達到了系統(tǒng)配置的上限,沒有空間創(chuàng)建新的。
到這里,基本可以猜出問題所在了。就是程序之前可能反復(fù)重啟,消耗了所有的信號量空間,達到一定次數(shù)后,無法創(chuàng)建新的信號量,導(dǎo)致啟動失敗。

9 查看系統(tǒng)配置參數(shù)
查看系統(tǒng)對信號量 共享內(nèi)存等的配置
?# cat /proc/sys/kernel/sem?
? 250 ? ? 32000 ? 32 ? ? ?128

可以看到,信號量給的是128個。
具體查看系統(tǒng)中創(chuàng)建的信號量

  # cat /proc/sysvipc/sem 
         key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime
  1678576641      32768   600          1     0     0     0     0 1649596772         43
  1678623274      65537   600          1     0     0     0     0 1649596832 1649596774
  1678624879    4259842   600          1     0     0     0     0 1649606005 1649605937
  1678625856     131075   600          1     0     0     0     0 1649596973 1649596905
  ...
  1678593752    4030586   600          1     0     0     0     0 1649604774 1649604707
  1678595070    4063355   600          1     0     0     0     0 1649604848 1649604776
  1678596881    4096124   600          1     0     0     0     0 1649604917 1649604849
  1678598116    4128893   600          1     0     0     0     0 1649604986 1649604918
  1678599937    4161662   600          1     0     0     0     0 1649605054 1649604987
  1678598220    4358271   600          1     0     0     0     0 1649964888 1649964880

統(tǒng)計一下,發(fā)現(xiàn)達到了上限。這里多的1是第一行,用于說明各個列段含義的行
? # cat /proc/sysvipc/sem ?| wc -l
? 129

10 驗證
刪除一個信號量,重啟程序,可以看到重啟成功

# ipcrm -s 4194431

  QLock::lock():  file name /tmp/qtembedded-0/QtEmbedded-0 id=d create=create 
  QLock::lock(): QT_POSIX_IPC 
  QLock::lock(): QT_POSIX_IPC 1 data id = -1 semkey=1678598220 (2, No such file or directory)
  QLock::lock(): QT_POSIX_IPC 2 data id = 4358271 semkey=1678598220, (2, No such file or directory)
  QLock::lock(): QT_POSIX_IPC 3 data id = 4358271 arg.val=200, (2, No such file or directory)

關(guān)閉程序,再次重啟,看到失敗,說明問題就是由于空間限制,導(dǎo)致信號量創(chuàng)建失敗產(chǎn)生

  QLock::lock():  file name /tmp/qtembedded-0/QtEmbedded-0 id=d create=create 
  QLock::lock(): QT_POSIX_IPC 
  QLock::lock(): QT_POSIX_IPC 1 data id = -1 semkey=1678598276 (2, No such file or directory)
  QLock::lock(): QT_POSIX_IPC 2 data id = -1 semkey=1678598276, (28, No space left on device)
  QLock::lock(): QT_POSIX_IPC 3 data id = -1 arg.val=200, (22, Invalid argument)
  QLock::QLock: Cannot create semaphore /tmp/qtembedded-0/QtEmbedded-0 'd' (22, Invalid argument)
  Cannot get display lock
  Aborted

11 進一步的研究
根據(jù)代碼來看,每次創(chuàng)建信號量的ftok函數(shù)調(diào)用參數(shù)都是一樣的,但是為啥QT每次打印出來的id不一樣呢。
因為不一樣,所以每次創(chuàng)建的總是保留著,直到空間用完。
??
但是根據(jù)接口說明,ftok同樣的參數(shù),生成的結(jié)果是一樣的。專門寫了一個程序驗證了一下:
? /tmp # /mnt/a.out?
? semkey is 1678611420?
? /tmp # /mnt/a.out?
? semkey is 1678611420?
? /tmp # /mnt/a.out?
? semkey is 1678611420?
??
為啥QT創(chuàng)建的不一樣呢?
我們重新創(chuàng)建文件,再跑程序,可以看到生成的不一樣了。
ftok是根據(jù)的文件的inode信息來生成id的。
? /tmp # rm /tmp/qtembedded-0/QtEmbedded-0
? /tmp # touch /tmp/qtembedded-0/QtEmbedded-0
? /tmp # /mnt/a.out?
? semkey is 1678611403?
??
因此,QT里是每次新建了文件導(dǎo)致id不一樣了。對此做針對性修改,問題即解決。

12:其他

涉及的代碼文件為:
qt-everywhere-opensource-src\src\gui\kernel\qappliction_qws.cpp
qt-everywhere-opensource-src\src\gui\embedded\qlock.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-744060.html

到了這里,關(guān)于一個QT程序無法啟動問題的分析與解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 解決Windows因缺少vcomp100.dll無法啟動程序的問題

    解決Windows因缺少vcomp100.dll無法啟動程序的問題

    其實很多用戶玩單機游戲或者安裝軟件的時候就出現(xiàn)過這種問題,如果是新手第一時間會認為是軟件或游戲出錯了,其實并不是這樣,其主要原因就是你電腦系統(tǒng)的該dll文件丟失了或者損壞了,這時你只需下載這個vcomp100.dll文件進行安裝(前提是找到適合的版本),當我們執(zhí)行

    2024年02月06日
    瀏覽(90)
  • 解決因缺少xinput1_1.dll無法啟動程序的問題

    解決因缺少xinput1_1.dll無法啟動程序的問題

    其實很多用戶玩單機游戲或者安裝軟件的時候就出現(xiàn)過這種問題,如果是新手第一時間會認為是軟件或游戲出錯了,其實并不是這樣,其主要原因就是你電腦系統(tǒng)的該dll文件丟失了或者損壞了,這時你只需下載這個xinput1_1.dll文件進行安裝(前提是找到適合的版本),當我們執(zhí)行

    2024年02月10日
    瀏覽(227)
  • 解決Windows缺少vcomp120.dll無法啟動應(yīng)用程序的問題

    解決Windows缺少vcomp120.dll無法啟動應(yīng)用程序的問題

    其實很多用戶玩單機游戲或者安裝軟件的時候就出現(xiàn)過這種問題,如果是新手第一時間會認為是軟件或游戲出錯了,其實并不是這樣,其主要原因就是你電腦系統(tǒng)的該dll文件丟失了或者損壞了,這時你只需下載這個vcomp120.dll文件進行安裝(前提是找到適合的版本),當我們執(zhí)行

    2024年02月08日
    瀏覽(91)
  • 電腦“應(yīng)用程序無法啟動,因為應(yīng)用程序的并行配置不正確......“問題的解決方法

    電腦“應(yīng)用程序無法啟動,因為應(yīng)用程序的并行配置不正確......“問題的解決方法

    問題 : win10某天開機發(fā)現(xiàn)絕大部分exe都無法運行或安裝,錯誤信息提示如下: “應(yīng)用程序無法啟動,因為應(yīng)用程序的并行配置不正確。有關(guān)詳細信息,請參閱應(yīng)用程序事件日志,或使用命令行 sxstrace.exe 工具?!?排查過程 :命令行 sxstrace.exe 工具無法正常打開 查看應(yīng)用程序

    2024年02月04日
    瀏覽(31)
  • 解決Windows缺少xerces-c_3_0.dll無法啟動程序的問題

    解決Windows缺少xerces-c_3_0.dll無法啟動程序的問題

    其實很多用戶玩單機游戲或者安裝軟件的時候就出現(xiàn)過這種問題,如果是新手第一時間會認為是軟件或游戲出錯了,其實并不是這樣,其主要原因就是你電腦系統(tǒng)的該dll文件丟失了或者損壞了,這時你只需下載這個xerces-c_3_0.dll文件進行安裝(前提是找到適合的版本),當我們執(zhí)

    2024年02月16日
    瀏覽(161)
  • VMware虛擬機啟動Ubuntu時報錯:“另一個程序已鎖定文件的一部分,進程無法訪問”該怎樣解決呢?

    VMware虛擬機啟動Ubuntu時報錯:“另一個程序已鎖定文件的一部分,進程無法訪問”該怎樣解決呢?

    寶子們有木有遇到這樣的問題呀“另一個程序已鎖定文件的一部分,進程無法訪問”,跟著辣面子來解決這個問題吧 按照自己路徑尋找 放心將它們刪除 出現(xiàn)此文件是因為虛擬機在運行的時候,會鎖定文件,防止被修改,如果系統(tǒng)突然崩潰、異常關(guān)機等,虛擬機尚未把已經(jīng)鎖

    2024年02月11日
    瀏覽(18)
  • 解決“無法啟動此程序,因為計算機中丟失VCRUNTIME140.dll,嘗試重新安裝此程序以解決此問題”方案合集

    解決“無法啟動此程序,因為計算機中丟失VCRUNTIME140.dll,嘗試重新安裝此程序以解決此問題”方案合集

    今天裝配mysql的時候,系統(tǒng)出現(xiàn)了報錯。 .dll文件是動態(tài)鏈接庫文件,是一種可執(zhí)行文件,很多時候系統(tǒng)會通過調(diào)用一些vc的dll文件來運行一些程序。 查閱資料以后發(fā)現(xiàn)有幾個解決方案,筆者通過第二種解決方案解決該問題。 方案1 : 通過下載 VCRUNTIME140_1.dll文件后直接復(fù)制到

    2024年01月16日
    瀏覽(28)
  • 解決因缺少d3dx9_31.dll程序無法運行啟動問題

    解決因缺少d3dx9_31.dll程序無法運行啟動問題

    其實很多用戶玩單機游戲或者安裝軟件的時候就出現(xiàn)過這種問題,如果是新手第一時間會認為是軟件或游戲出錯了,其實并不是這樣,其主要原因就是你電腦系統(tǒng)的該dll文件丟失了或者損壞了,這時你只需下載這個d3dx9_31.dll文件進行安裝(前提是找到適合的版本),當我們執(zhí)行

    2024年03月14日
    瀏覽(159)
  • 關(guān)于Qt程序打包后運行庫依賴的常見問題分析及解決方法

    關(guān)于Qt程序打包后運行庫依賴的常見問題分析及解決方法

    目錄 一. 大致如下常見問題: (1)找不到程序所依賴的Qt庫 version `Qt_5\\\' not found (required by (2)Could not Load the Qt platform plugin \\\"xcb\\\" in \\\"\\\" even though it was found (3)打包到在不同的linux系統(tǒng)下,或者打包到高版本的相同系統(tǒng)下,運行程序時,直接提示段錯誤即segmentation fault,或者I

    2023年04月17日
    瀏覽(25)
  • 系統(tǒng)錯誤 無法啟動此程序,因為計算機中丟失MSVCP140_1.dll。嘗試重新安裝該程序已解決此問題

    系統(tǒng)錯誤 無法啟動此程序,因為計算機中丟失MSVCP140_1.dll。嘗試重新安裝該程序已解決此問題

    我在windows10系統(tǒng),使用Qt5.15.2 打包命令:windeployqt.exe ImageManageSys.exe ,把ImageManageSys.exe 拷貝到windows7系統(tǒng)下,報錯:ImageManageSys.exe - 系統(tǒng)錯誤 無法啟動此程序,因為計算機中丟失MSVCP140_1.dll。嘗試重新安裝該程序已解決此問題。 當您在Windows 10系統(tǒng)上使用windeployqt.exe打包應(yīng)用程

    2024年02月07日
    瀏覽(123)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包