2014-03-31 83 views
2

有沒有人遇到過以下情況?爲什麼gdb在調試MPI程序時來回走動?

爲了調試目的,我只用一個mpi進程啓動基於mpi的程序和「mpi-run -np 1」。但是,當我調試程序時,經常會發生重複的切入和切換。

因此,我們假設,我一行一行地跟蹤源代碼,直到達到興趣點。然後,我試圖介入,並輸入「n」,希望進行一行。但是,調試器會返回到函數的第一行。只有在我經歷了兩次或三次之後,我才能繼續。

印象是調試器沒有做錯什麼,因爲結果被認爲是正確的。我真的很好奇它爲什麼會發生的原因。

提前致謝!

+0

[這可能與您的問題有關](http://stackoverflow.com/questions/20992356/gdb-jumps-to-wrong-lines-in-out-of-order-fashion)tl; dr該線程的版本是它可能是一個編譯器錯誤。 – computerfreaker

+0

你沒有優化編譯你的代碼,即你是否在編譯器標誌中明確包含了'-O0'? –

+0

@computerfreaker,這可能是一個愚蠢的問題,那個線程的「tl; dr版本」是什麼意思? – user3475359

回答

2

觀察到的行爲通常是編譯器優化處於活動狀態的結果。優化可能會導致二進制代碼不完全遵循源的結構 - 它仍然會給出相同的結果,但編譯器會重新排列操作以便更高效地執行。另外,一些函數可能會被內聯。結果,調試信息中的指令範圍和源代碼行之間的對應關係變得無用。

執行源代碼級調試時,請務必確保使用大多數編譯器的-O0標誌關閉優化,或者不要爲Sun/Oracle編譯器提供任何優化標誌。請注意,某些編譯器選項可能會導致優化級別提高。例如,在Sun/Oracle Studio中啓用OpenMP支持(-xopenmp)會自動將優化級別提升爲-xO3。相反,應該使用-xopenmp=noopt,並且沒有明確指定優化級別。另外,一些編譯器默認進行優化,例如Intel的編譯器。