表面上的問題

2021-09-25 10:52:24 字數 1200 閱讀 4224

今天同事請我幫忙解決乙個問題。問題的表面現象是他在 take 乙個訊號量時系統會進入異常。我在看的時候他還在堅持是 take 訊號量造成的問題,不過我對這一判斷並不以為然。

要知道 take 訊號量這種基礎的操作會產生問題的可能性幾乎為 0 。雖然程式確實是在執行到 take 訊號量後進入到異常的,但這不過是表面現象,要說這一表面現象就是問題所在,我是不相信的。

由於上乙個月我剛遇到過乙個棧溢位的問題,那個問題跟同事的問題的表現有相同之處。於是我首先懷疑棧溢位的問題。

為了確定是否真的是棧溢位的問題,我將程式的棧調到之前的數倍,重新執行程式,結果卻發現問題仍舊存在,這就推翻了這一懷疑。

由於同事使用了阻塞的方式 take 乙個訊號量,因此呼叫此 take 語句的任務將會被掛起,其任務的 tcb 指標將從就緒表中移除並加入到待 take 訊號量的等待鍊錶中。如果在任務成功獲取到訊號量之前,訊號量中的等待鍊錶被意外修改,那麼當任務要重新排程恢復執行時就會產生異常。

觀察發現 take 訊號量的等待鍊錶指向了乙個異常的位址,這是乙個重要的發現。

這之後我們通過 watch 此訊號量中的等待鍊錶來找到意外修改發生的位置。很快我們便發現等待鍊錶是在 memset 中被修改的,檢視這個 memset 語句卻並沒有發現什麼問題。

除錯到這裡,我們可以說 memset 的函式呼叫導致了問題,可這樣的說法也顯得不太合理。

為了進一步確認,我們檢查了 memset 的各個引數。在檢查引數的過程中我們首先確認位址都是正確的,然後我們懷疑可能是大小有問題。可是這個大小是用 sizeof 計算的結構體大小,應該是不容置疑的。

這樣看來 memset 好像沒有問題啊!不過我們還是通過列印結構體首尾元素的位址,手動計算了下結構體的大小。到了這一步我們終於發現了問題的根源。

sizeof 得到的大小比結構體的大小多出了很多位元組。sizeof 是在編譯期間確定的值,那麼我們已經可以斷定這是標頭檔案錯誤包含導致的問題。

檢查發現**中包含了乙個錯誤的標頭檔案,這個標頭檔案恰好是同事正在修改的標頭檔案,他為了備份建立了兩個標頭檔案,在另外乙個標頭檔案中進行修改,卻沒有用新的標頭檔案替換舊標頭檔案的包含語句。

在修改現有的**時我們可能會建立乙份當前**的備份,然後在備份中修改**,在修改完成之前在工程中保留原來的**。這樣的做法很容易造成混亂,不值得提倡。

現在的專案幾乎都會使用專案管理工具來管理。這樣你完全可以直接將舊的**移除,重新建立新的**。既不用擔心丟失舊**,又能夠避免混亂造成的各種隱含問題。何樂而不為呢?

表面上又佛又喪,背地裡天天向上,算是看透你們了!

曾經有一段時間,以為大家的業餘生活狀態都差不多,不外乎煲劇 遊戲 王者 吃雞等 葛優躺 美食 娛樂等。然而,越來越多的跡象讓我漸漸明白,這都是假象。朋友圈裡大家又佛又喪,背地裡卻在天天向上,真是看透你們了。當看朋友圈和跟大家聊天時,大家表現的都很謙虛 最近墮落了 最近不咋地 窮困潦倒 混日子唄 然而...

表面上承認錯誤 做乙個可以承認錯誤的領導者

表面上承認錯誤 這聽起來似乎很明顯,但是如果您想建立一支更加敬業的員工隊伍,就需要積極參與。這意味著,無論您是首席執行官還是一線經理,都需要努力與員工面對面地聯絡。這可能意味著任何事情,包括到處走動,在辦公室和小隔間進站,到與您的團隊舉行市政廳討論並隨後回答問題。但是,大多數領導者根本無法抽出時間與...

平面上的郵局

問題描述 在乙個平面上有n 1 n 100000 個村莊,每個村莊通過座標 xi,yi 標示位置,10 9 xi,yi 10 9。現在想要建乙個郵局,使得到各個村莊的距離之和最短。在這個問題中,距離定義為曼哈頓距離,即點i和點j的距離等於 xi xj yi yj 輸入第一行為n,表示村莊的數量 接下...