2013-03-21 123 views
1

我們有一個用-g和-O編譯器標誌編譯的大二進制文件。問題在於,在使用gdb進行調試時,在某些文件/行中設置斷點不會在該文件/行處中斷,或者會在其他行中中斷。我知道這可能是由於-O編譯器標誌(用於優化)。不幸的是,我不能刪除編譯器-O標誌,因爲有很多腳本級別需要注意。GDB:斷點沒有命中

我該如何確保在我想要的文件/行位置上打破代碼?是否有一行代碼,我可以添加它將永遠不會優化或將打破使用gdb調試時 - 我試過這樣的事情 -

int x; int y;

但是仍然GDB斷點無法正常工作 - 我如何正確設置它?

回答

1

我可以想到兩個問題,內聯和優化。由於沒有標準的方法來告訴編譯器禁用內聯和/或優化,所以只能以編譯器特定的方式執行它。

要禁用GCC中的內聯,您可以在該方法上使用__attribute__((noinline))

要禁止編譯器優化功能(並且未經測試,爲您提供穩定的代碼行,您可以在其中設置斷點),只需將其添加到代碼中;

asm (""); 

這兩者都記錄在案at this page

+0

如果想驗證是否發生了什麼,並且願意將其加入,請查看gcc的'-save-temps'選項,該選項允許檢查預處理器和彙編器的輸出。 – 2013-03-21 15:08:41