2017-05-29 85 views
-4

我想知道是否有記錄只是彙編代碼指令的一種方式,是執行。這可以通過使用GDB來實現嗎?日誌彙編代碼執行

+2

代碼中的所有內容都是*只是程序集* – Ari0nhh

+0

反彙編二進制代碼會更容易......這將爲您提供所有已執行的指令。如果您需要關注分支等,請添加*特定的*日誌代碼。 –

+0

[Process Record](https://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial)可能是您要查找的內容中最接近的。 – ks1322

回答

1

理論上,將CPU置於單步模式非常簡單,並且在執行時記錄每條指令。實際上,你不能合理地計劃這樣做的時間超過幾秒鐘(或者一般訂單上的某些事情)。讓我們通過一些數學來理解爲什麼。

現在,我們假設一個地址佔用32位。我們假設典型的指令平均使用大約2個字節的數據。一個典型的CPU可能運行在2.5 GHz,並且每個週期執行大約2條指令。因此,記錄單個指令需要大約6個字節的數據。 CPU每秒執行大約50億次。做數學計算,這意味着記錄一秒鐘的執行將需要大約6 * 50億字節=每秒30千兆字節(每個核心)。

如果我們把它寫入RAM,我們可能預期執行速度會比正常慢一點,所以執行和記錄一秒鐘將需要幾分鐘。然而,當我們用完RAM時(以30GB/s,我們會很快),並且必須將數據寫入磁盤,我們的帶寬(即使是相當快的SSD)也會下降很多,所以執行速度將很快甩掉很多。同樣,目前,我(或多或少)假設我們可以完全使用(例如)至少一個內核來收集和記錄由另一個內核生成的數據。如果我們想從四核(比如說)中記錄數據,那麼數據收集可能會減慢一些數據的收集速度,並且(更糟糕的)數據生成的速度也會增加4倍(所以我們有一個核心來收集120 GB/s)。這顯然會變得更加困難。

從那裏我們遇到了另一個明顯的問題:我們將如何處理這個數據的?考慮到我們生產的數量,顯然最好在執行過程中進行儘可能多的處理以找到我們真正關心的數據,而不是僅僅收集所有數據,而不管它最終會變得多麼無用。

所有這一切說,我不認爲gdb真的是這份工作的正確工具。如果你真的堅持這樣做(可能是一個糟糕的主意,但是......),你幾乎肯定希望代碼專門用於處理這個特定的工作。