2017-04-04 63 views
0

隊列我想調試代碼段:調試C++ IDE中的

#include <iostream> 
#include <queue> 
#include <random> 
#include <time.h> 

using namespace std; 

int main() 
{ 
    cout << "Hello, World!" << endl; 
    queue<int> q; 
    srand(time(NULL)); 
    for(int i = 0; i < 10; i++) 
    { 
     q.push(rand() % 100); 
    } 
    int a = q.front(); 
    q.pop(); 
    int b = q.front(); 
    q.pop(); 
    cout << "a: " << a << ", b: " << b << endl; 

    return 0; 
} 

我試圖調試它在2個集成開發環境 - 克利翁(我個人最喜歡的)和VS2015。然而,這兩個沒有顯示隊列中的項目(因爲他們,如果我使用一個數組,例如):

克利翁

enter image description here

VS2015

enter image description here

當我繼續調查時,我注意到如果我刪除CLion中的上限斷點,它確實顯示隊列元素:

克利翁 - 好版

enter image description here

關於它爲什麼發生任何想法,如果有一種方法可以看到在「壞」的情況下,隊列中的元素?

+1

關於克利翁的行爲,這是一個錯誤,那就是:https://youtrack.jetbrains.com/issue/CPP-7166 GDB:變量在某些情況下不更新 –

回答

0

enter image description here您是否使用在項目中選擇的調試進行編譯? 我可以清楚地看到隊列值。 enter image description here

+0

是的。沒有幫助。即使當我更改爲x64 ... – noamgot

+0

這是我做的。 複製粘貼你的代碼。 在該地點放置一個斷點。 調試 - >從調試開始 –

2

刪除上面的斷點並在32位和64位編譯之間切換不會影響到這一點。 32/64位與生成的彙編代碼有關。代碼編譯正確後,32位和64位彙編代碼將不會相同,但程序本身仍將保留相同的功能。也就是說,64位程序不能比32個大型程序「做得更多」。這是圖靈完備性的一個超級淡化的定義,但是這裏的結果是,無論您將構建目標設置爲32位還是64位,目前您嘗試執行的操作都無關緊要。

雖然您使用的IDE在這裏的效果會很小,因爲它們使用不同的調試器。既然這兩個調試器在你的情況下做了同樣的事情,我可以說我們可以安全地將其記錄爲用戶錯誤(見下文),但正如我在後面說的,如果你願意,繼續與調試器一起工作。這是掌握絕對必要的技能。支持你儘早入門。

至於你的調試問題,here is my debug of your program.請注意我使用的斷點。就像耶穌基督在我面前所說的那樣,調試對我們兩個人都是正確的。在這些情況下通常的嫌疑人正試圖調試發佈版本。當您編譯調試版本時,編譯器不會執行儘可能多的優化,以允許您通過變量跟蹤代碼並準確查看發生了什麼。一旦代碼正常運行,您就可以切換到發行版本,編譯器會優化掉大量變量以實現最佳性能。

如果您按照您所說的在Debug構建下進行了調試,那麼我會說只是將其調整爲調試器錯誤。如果你是一個C++新手,那麼你有可能沒有足夠的經驗來瀏覽調試器的複雜性。沒有不敬的意圖,但調試不僅僅是一門藝術,它也是一門科學,一個新的開發者不會因爲不知道如何操縱這個工具而發生故障。

0

確保

1)正在調試調試版本(即調試信息存在,並且不進行優化)

項目屬性 - > C/C++ - >常規 - >調試信息格式設置爲 「程序數據庫」

項目屬性 - >鏈接器 - >生成調試信息設置爲 「/ DEBUG」)

2)原料結構模式被禁用

工具 - >選項 - >調試 - 對象>顯示原結構沒有被選中

1

我找到符合克利翁問題的解決方案 - 只需按下在變量選項卡中的變量,然後按上Duplicate Watch(標記爲紅色圓形波紋管,熱鍵:ctrl+D),你就大功告成了: enter image description here