2015-02-11 226 views
0

我正在嘗試調試一些C++ 11代碼,而LLDB沒有幫助。代碼看起來大致是這樣的:如何關閉Clang ++中的_all_優化?

void f(my_type dt) { 
    try { 
     g(h(dt)); 
    } 
    catch (/* reasonable exception type here */) { 
    } 
} 

當我把一個斷點在g(h(dt))線,LLDB堅持的dt值是不可用的。它肯定不能被消除,因爲它被用於執行h作爲一些數據庫查詢的輸入。

我用CMake的,並將其編譯使用以下標誌:

CXX_FLAGS = -g -O0 -fPIC -std=c++11 -stdlib=libc++ -Wall 

我證實了(使用make VERBOSE=true),這些標誌是,的確,用於構建該項目。據我所知,應該包含完整的調試信息,並關閉所有優化。這顯然不是這種情況。 我還可以添加哪些其他標誌來強制Clang在調用堆棧中保留所有參數和變量?

不幸的是,使用小文件和函數的小測試用例不會再現這個問題:大多數情況下,變量是按照我的預期保存的。

我正在運行優勝美地的Mac上工作。

$ clang++ --version 
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin14.1.0 
Thread model: posix 
+0

'-fno-inline'也許? – Pradhan 2015-02-11 20:57:45

+0

不,'-fno-inline'沒有幫助。 – gcv 2015-02-12 00:02:23

回答

1

這很可能是編譯器中的一個錯誤。在-O0時,它應該始終保持變量在其定義塊中存在。它實際上可能是,但有人忘記了它在編譯器管道中的什麼地方。

如果你能利弊一些示例,說明這個問題,你不介意與LLVM人分享,那麼請提交或者與LLVM的Bugzilla(http://llvm.org/bugs/)或蘋果LLVM團隊http://bugreport.apple.com的錯誤。