12.2 You are given the source to an application which crashes when it is run. After running it ten times in a debugger, you find it never crashes in the same place. The application is single threaded, and uses only the C standard library. What programming errors could be causing this crash? How would you test each one?
這道題說有個應用程式執行的時候崩潰了,在除錯執行了十次後,發現在同一個地方不崩潰了。這個應用是單執行緒的,只用了C語言的標準庫,問什麼程式原因會導致這個崩潰,怎麼樣檢測每一個原因。根據書上的描述,我們先來看一個會導致程式崩潰的通常的原因:
1. 隨機變數。程式有時候會用一些隨機數字或變數,每次執行時值都不同。
2. 未初始化的變數。程式有未初始化的變數,在有些程式語言中,這可能會賦值為任意值。
3. 記憶體洩露。程式有時候會用盡記憶體,也包括堆和棧的溢位。
4. 外部依賴:程式有時候會依賴其他的應用,機器或資源。如果有很多的外部依賴,很有可能程式會在某一點崩潰掉。
既然程式不在同一個地方崩潰,那麼有可能是和某一個部件或場景相關聯。例如,可能程式在開啟後,什麼都不動的情況下是好的,但是當讀入了一個檔案,或者有了其他的操作時,崩潰了。那麼我們就最好用排除法來找原因,關掉所有其他的應用,仔細追蹤各種資源。如果有部分程式可以禁用,那麼就禁用掉,然後在不同的機子上跑程式看是否會遇到同樣的問題。
另外我們也可以藉助一些專業的工具來幫我們找錯,比如對於問題2,未初始化的變數,就有專門的工具來替我們找到這些變數。