2010-07-08 50 views
2

可能重複:
Is <value optimized out> in gdb a problem?值上段故障優化了

嗨,

我仍然在學習先進的C++編程。我在C++代碼中遇到分段錯誤。在使用gdb時,失敗點是在解除分配器(malloc)參數之一的情況下被優化的值(av = value optimized)。我的問題是,這個條件(值優化)是否導致解除分配器中的分段錯誤?我之所以問這個問題是因爲我能夠打印這些值,但gdb由於某種原因無法讀取它們。

謝謝。

+0

我不太明白你的問題......也許代碼片段可以幫助...我推薦使用新/刪除操作符而不是malloc/realloc/free,因爲你正在學習C++ – YuppieNetworking 2010-07-08 16:26:34

+2

如果你正在嘗試建議有一個編譯器錯誤,你會得到一個非常懷疑的迴應,沒有更多的解釋和很多代碼。 – 2010-07-08 17:04:36

回答

5

不,優化值只是表示優化器通過寄存器傳遞參數,這意味着gdb無法看到它的值。如果你用-O0編譯,你會在gdb中看到這個值。

錯誤可能是您的錯誤。例如。釋放已被釋放的地址,或釋放從未分配的地址。

附註:對於C++,建議使用newdeletenew[]delete[]

您需要提供更多的上下文。

+4

通常是正確的,但是當某些東西被「優化出來」時,並不總是意味着它通過了寄存器。有時候,價值已經被分解到某個特定價值在任何實際意義上都不存在的地步。 – 2010-07-08 16:38:01

+0

@Evan謝謝...我第一次在gdb中注意到這個條件(值優化出來),尤其是每個seg錯誤..我只是想了解它是我的還是環境......看起來像是我的: - ) – user380644 2010-07-09 01:02:16

+0

謝謝...我第一次在gdb中注意到這個條件(值優化了),尤其是每個seg故障..我只是想了解它是我的還是它的環境..看起來像它的我:-) – user380644 2010-07-09 01:02:45

1

優化後的值不能引入段錯誤。這意味着malloc的參數在調用後沒有使用,所以不是將它存儲在調用者的堆棧幀中,而是使用寄存器直接傳遞給malloc,所以gdb無法顯示內存地址(它不存儲在內存)

+0

讀取經過優化的值不會導致段錯誤,但如果該值是指針,則解除引用可能會導致錯誤。 – Karmastan 2010-07-08 16:32:17

+1

@kar如果它在代碼中的某個地方被解除引用,它將不會被優化 – 2010-07-08 16:56:07

+0

根據我的經驗,「優化出來」僅僅意味着調試器想要顯示的確切值在該時刻並不存在於內存中。它可能是價值不再生活,所以它不存在。值也可能只存在於寄存器中。我在使用gcc和gdb時看到過這種情況。 – Karmastan 2010-07-08 17:08:09