記一次CLTQ指令引起的函式返回值異常

2021-10-03 18:11:55 字數 576 閱讀 6799

問題如下:同一套**分別編譯出32位和64位程式;32位程式在執行正常,但是64位程式執行出現coredump。

問題分析:對64位程式的coredump檔案進行分析。發現函式函式返回的指標被截斷了。64位程式返回指標有兩種情況,第一種,指標高32位全部填充0;第二種,指標高32位全部填充1,第二種情況很容易迷惑人,指標的位址怎麼指向核心位址。

1. 對二進位制檔案進行反彙編,發現函式返回的指標確實複製給rax暫存器,但是函式返回之後,指標指向的位址就被截斷了。

2. 在反彙編檔案中查詢,在呼叫該函式的地方發現,在call指令之後,多了一條奇怪的「cltq」指令,查了查該指令的作用是對有符號數字進行擴充套件。

3. 為嘛會出現這個指令?因為在呼叫該函式的地方沒有找到對應的標頭檔案,編譯器預設為函式返回值是32位資料,但我們實際使用該該函式返回值時,是當做64位處理的,因此對編譯器又不得不對32位資料進行了帶符號擴充套件——如果高位是1,擴充套件時,在高32位全部填充1,如果高位是0,在高32位全部填充0——這就是我們在coredump檔案中看到的現象

解決方法:呼叫該函式的檔案中,新增該包含該函式宣告的標頭檔案;或者在呼叫該函式的c檔案中提前使用extern宣告該函式。

記一次加班所引起的深思

昨天公司進行上線前整合im聊天工具,我負責這塊的除錯,忙了一下午加上一晚上。實際上沒有難度的,但給我帶來了很多麻煩。讓我一一道來吧。除錯工作主要是在js端進行的,im又只能用ie來除錯,ie的debug工具我又不會用,我就是用了最原始的alert 場景是這樣的,當使用者已經登入 平台的時候,如果發起...

記一次dirty ratio引起的線上事故

磁碟 75 最終累計到100 load1 遠遠 8 cpu mem 85 kernel報錯如下 預設情況下,linux會最多使用40 的可用記憶體作為檔案系統快取。當超過這個閾值後,檔案系統會把將快取中的記憶體全部寫入磁碟,導致後續的io請求都是同步的。將快取寫入磁碟時,有乙個預設120秒的超時時間...

記 一次電流不夠引起的故障解決

前兩天處理了乙個筆者不怎麼常見的問題點,特別的在這裡記錄一下,以備之後不小心忘記後的註記。技能名稱 技能熟練度 技能教程鏈結 模擬電路 了解暫無 當前除錯一塊單板,筆者除錯的模組主要為訊號採集電路。功能為採集輸入的訊號波形並進行引數的輸出。測試人員在進行功能的驗證過程中,使用外部的輸入的交流訊號進入...