記一次蛋疼的除錯

2022-07-13 12:54:09 字數 1625 閱讀 2153

起因是醬紫的:

有個學弟給他的學弟出了一道題:

下面是用阿姆斯特朗加密演算法加密後的一串數字,解密它!數字內容(2032951656 1629517167 1981834610 544830053 1685024615 0)

關於阿姆斯特朗迴旋加速噴氣式阿姆斯特朗加密演算法的第一步:

該演算法首先讀入一段文字,該文字的每個字元僅佔1位元組,直到結束。

然後,該演算法會將連續的每4個位元組的二進位制位按逆序連線,湊成乙個整數,並在末尾加0。例如:

讀入:abcdefgh

(二進位制:01100001(a) 01100010(b) 01100011(c) 01100100(d) 01100101(e) 01100110(f) 01100111(g) 01101000(h))

轉換後:

1684234849 1751606885 0

(二進位制:01100100011000110110001001100001 01101000011001110110011001100101 0)

(01100100(d)01100011(c)01100010(b)01100001(a) 01101000(h)01100111(g)01100110(f)01100101(e) 0)

請程式設計輸出答案

無輸入,輸出結果

某學弟是醬紫做的:

然後乙個數乙個數的跑,並且手動記錄答案

且不說他那一堆左移右移的操作,我第一眼看到的最大的問題是在printf那裡,%c對應到了long long int上,常理來說應該會出異常,但是他卻把結果正常輸出了,於是猜測是不是printf有啥神奇的黑科技,於是模擬了乙個printf,其實就是寫了個動態引數的函式,然後乙個位元組乙個位元組的輸出呼叫棧的內容。比如n是1684234849 的時候,d理想狀態是'a', c => 'b', b => 'c', a => 'd',並且我之後的假設全部基於此,並且蛋疼就蛋疼在我這個理想狀態上。

這是理想狀態的堆疊示意圖,但是實際上我的輸出顯示堆疊是下邊那個樣子,誤以為是函式在壓棧的時候對資料進行了壓縮,這個問題我找了幾個dalao討論了半天也沒有討論出啥,後來請教了下貓總。貓總原話:「除錯的時候直接看stack的記憶體」,然後咱就開啟了vs,然後我注意到了紅框裡的那個:

時光雞,光雞,雞,

我qndyd

到這我才恍然大悟,d的內容是0x00 00 00 00 64 63 62 61

printf接收到的引數實際是醬紫的:

正好四個%c對應了d的前四個位元組

至於d為啥沒有按照理想情況結果是0x61,因為他是long long int啊~

啊!

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次nginx module 除錯

參考了 先進入nginx工作目錄 usr local nginx sbin 使用gdb q tui q選項是以安靜模式啟動,不顯示gdb版本等資訊。tui選項可以顯示 介面 然後在gdb中啟動nginx shell nginx 啟動之後,可以檢視當前nginx中的程序號 shell pidof ng...