2015-02-11 2 views
0

Я пытаюсь отладить некоторый код C++ 11, и LLDB бесполезен. Код выглядит примерно так:Как отключить _all_ оптимизации в Clang ++?

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, работающим с Yosemite.

$ 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

+0

Нет, '-fno-inline' не помогает. – gcv

ответ

1

Это скорее всего ошибка в компиляторе. При -O0 он всегда должен поддерживать переменные в реальном времени в течение своего определяющего блока. На самом деле это возможно, но кто-то потерял информацию о том, где он находился где-то в конвейере компилятора.

Если вы можете минусы некоторые пример, который показывает этот вопрос, который вы не возражаете обмена с LLVM людей, то, пожалуйста, сообщите об ошибке либо с LLVM Bugzilla (http://llvm.org/bugs/) или с LLVM командой Apple, в http://bugreport.apple.com.

Смежные вопросы