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,未初始化的變量,就有專門的工具來替我們找到這些變量。