2011-06-30 88 views
2

我在調試C中的宏時遇到了問題。當我嘗試設置斷點時,我收到消息:「斷點不會被命中,沒有與此行關聯的可執行代碼... 「有趣的是我可以調試文件中的所有其他內容,而不是這個宏。我已經正確加載了所有的符號文件,進行了清理和重建,並關閉了優化。任何想法爲什麼調試這個宏不起作用?在Visual Studio中調試宏的問題

+2

調試宏已被擊中或錯過與我,我儘量避免使用它們,如果可能的話。相反,如果運行正常,您可以將宏展開爲源代碼並進行調試,然後將其重新放回宏窗體中。 –

+0

我試過這個,到目前爲止它正在工作......感謝您的幫助! – anthv123

回答

3

不知道足夠的情況下(這可能是有益的,看看定義,調用和在那裏你要設置的斷點),這裏有一些猜測:

你要爲宏定義斷點或者它被調用的地方? 如果你在定義中設置它,那麼這就是你會看到的錯誤。 該定義告訴預處理器在您的代碼中的其他地方進行替換,因此,當代碼到達編譯器時,其上的#define行被替換爲空行。

如果您在使用的位置正確設置斷點,您確定使用的是您認爲自己的宏的定義,並且該宏沒有被條件編譯以產生任何代碼? 這是禁用某些東西(例如調試輸出)的常用方法,並且不會在調用它的行上提供可執行代碼(除非其周圍有其他可執行代碼)。 檢查這一點的一種方法是在宏定義旁邊放置一個#error行 - 如果正在使用它,那麼編譯器將會吐出一個錯誤。

請記住,宏函數只是文本替換,所以調用它們的所有代碼都放在調用的一行(每一個調用)上。你實際上不能調試它們(在步進變成一個'多行'宏函數),你只能跨過它們比較前後狀態。這是複雜的宏功能可能是一個壞主意的主要原因之一。

+0

好吧,正試圖做一步一步的多線調試。我想我真的不明白宏在做什麼。感謝您的洞察! – anthv123

+0

想到預處理器是一個稍微更強大的查找和替換,沒有什麼比這更少了。這既好又壞。你發現了一件壞事。告訴visual studio輸出中間(預處理)文件以便您可以看到實際結果是什麼會很有意義[Project Properties => C/C++ => Preprocessor => Generate preprocessed file] – WillW