除錯最佳化程式碼

除錯最佳化程式會呈現特殊可用性問題。 最佳化可以變更作業順序、新增或移除程式碼、變更變數資料位置,以及執行其他轉換,讓產生的程式碼難以與原始來源陳述式產生關聯。

例如:
資料位置問題
使用最佳化程式時,不一定可以確定變數的最新值所在的位置。 例如,如果將最新的值儲存在暫存器中,則記憶體中的值可能不是最新的。 大部分除錯器無法遵循將儲存庫移除至變數,而在除錯器中它會顯示為永不更新,甚至可能永不設定該變數。 這與沒有最佳化的情況相反,所有值都清除回記憶體,而除錯可以更有效且更可用。
指示排程問題
使用最佳化程式,編譯器可能會重新排序指令。 也就是說,根據原始原始碼中的字行順序,指令可能不會依照您預期的順序來執行。 此外,陳述式的指示順序可能不是連續的。 當您使用除錯器逐步執行程式時,程式可能會出現,就像它回到程式碼中先前執行的行一樣 (指令交錯)。
合併變數值
最佳化可能會導致移除及合併變數。 例如,如果程式有兩個表示式將相同的值指派給兩個不同的變數,編譯器可能會替代單一變數。 這可能會禁止除錯可用性,因為程式設計師預期看到的變數在最佳化程式中不再可用。
您可以採取幾種不同的方法來改善除錯功能,同時最佳化您的程式:
先對非最佳化程式碼進行除錯
請先對程式的非最佳化版本進行除錯,然後使用您想要的最佳化選項重新編譯它。 如需在此方法中有用的部分編譯器選項,請參閱 在存在最佳化的情況下除錯
使用 -g level
使用 -g 層次子選項來控制可用的除錯資訊量。 增加它可改善除錯功能,但會防止某些最佳化。 如需相關資訊,請參閱 -g
使用 -qoptdebug
使用 -O3 最佳化層次或更高層次進行編譯時,請使用編譯器選項 -qoptdebug 來產生虛擬程式碼檔案,以更精確地對映至指令和變數值在最佳化程式中的運作方式。 使用此選項,當您將程式載入除錯器時,將會對最佳化程式的虛擬程式碼進行除錯。 如需相關資訊,請參閱 使用 -qoptdebug 來協助對最佳化程式進行除錯