2015-09-15 27 views
1

當我嘗試在GDB中運行我的程序時。主結束後,而不是程序結束,我的程序開始跳回到我的主中間,然後隨機跳躍(不向前)。 假設我的主線有57和161之間的線。當程序結束161時,它開始跳到67線,然後跳到64線,然後61線,然後跳到145,最後跳到161線然後結束程序。程序沒有跳到第一次運行(57-> 58-> 59-> ..-> 67-> 68-> 69-> ..-> 161)就像我描述的那樣,它開始做跳躍。我沒有在我的程序中使用和轉換或貼上標籤。它只是在主結束後開始隨機跳躍,而不是結束程序。爲什麼我的CPP在程序結束後隨機運行

這裏是我的GDB一些輸出:

145 evolve1.RVpotentialSample[0].outputHist((char*)"data/potentialHistS",sampleSize/10); 
(gdb) n 
67  Action sample1; 
(gdb) n 
64  velocity_verlet_cell_SBC evolve1(number_of_particles*2,dt,sampleSize); 
(gdb) n 
61  initial_MC_SBC initial1(number_of_particles,temp,100*number_of_particles); 
(gdb) n 
145 evolve1.RVpotentialSample[0].outputHist((char*)"data/potentialHistS",sampleSize/10); 
(gdb) n 
161 } 
(gdb) n 

我甚至不知道怎麼能這樣呢。 GDB在節目結束時向我展示了一些奇怪的跳躍。感謝您的任何可能的意見。

+0

跳躍總是相同還是隨機?除非它是GDB的一個bug,否則你可能最好不要發佈你認爲應該歸咎於的代碼。 – Michael

+1

您正在調試優化版本嗎?如果是這樣,那麼一種解釋可能是由於正在使用優化,源代碼與實際的可執行文件不匹配。 – PaulMcKenzie

+0

@Michael跳躍實際上並不是隨機的,但它僅僅是意想不到的,它總是以固定順序發生。我的代碼非常混亂,也包括許多課程。在這裏發佈所有的代碼將是相當混亂的。 –

回答

2

有你觀察到的行爲的兩個通常的原因:

  1. 你建立你的計劃與優化(-O2或類似的標誌),或析構函數的類類型的
  2. 你有局部變量。

如果是第一種情況,您通常會一直觀察程序「不停地跳躍」(不僅僅是在程序結束時),因爲編譯器會重新安排指令,使得行順序不再順序。

在第二種情況下,編譯器通常從聲明變量的同一行調用析構函數。

也在我的析構函數之前設置了一個斷點。並且在所有析構函數之後,它開始按照我描述的跳躍

您可能會誤解。當程序跳回時,執行一些stepi命令。你很可能會落在一個沒有設置斷點的析構函數中。

+0

首先,謝謝指出這兩種可能性。 第一種可能不應該是這種情況,因爲我使用-O0並且它在開始時沒有跳躍,它只在main結束後纔開始。 所以我認爲這是非常高的機會是第二種情況。我不太理解第二種情況。局部變量是指變量在main中聲明?我有自己的定義析構函數的自己的類,這是在我的主要聲明。所以這會導致問題?如果我主要在外部申報,是否可以解決問題? –

+0

@WanChap你*不需要解決問題,但是:移動'main'外的變量會導致它在程序退出時被破壞,而不是在'main'結尾。 –

+0

我可能明白你的意思了。所以那些在gdb中的跳轉實際上就是構造函數的地方,但它不是再次運行構造函數,而是實際運行析構函數。所以沒有什麼錯誤發生,代碼沒有再次運行相同的行。謝謝俄國人。 –

相關問題