| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Флаги компилятора |
| Автор: xTr1m 16.7.2012, 18:50 |
| В http://forum.vingrad.ru/forum/topic-348704/anchor-entry2470489/0.html теме я в итоге нашел набор классов, позволяющих распечатать текущий стек. сейчас дошло дело до применения, в итоге получилось, что в Release стек распечатывается не полностью. компилятор у меня msvc, добавил флаг /ZI (Debug information format: Programm Database for Edit and Continue), тогда компилятор ругнулся на флаги /GL (Whole Progrmm Optimization) и /O2 (Optimization). Убрав их, я получил работающий вариант с выводом стека. Сам вот так с флагами я никогда не игрался, поэтому прошу более опытных коллег объяснить, что я потеряю, не используя эту оптимизацию и могу ли просто так лих выставлять для Release флаг /Zi |
| Автор: leniviy 16.7.2012, 19:15 |
| /ZI и /Zi - разные вещи. Должно хватить /Zi. На скорость он не влияет, только размер получается побольше. Оптимизация с влагом /Zi должна работать, с /ZI - нет. Оптимизация не должна полностью отключить генерацию стека, но могут быть неточности, если, например, какая-нибудь функция станет inline |
| Автор: xTr1m 16.7.2012, 19:19 |
| Да, извиняюсь. С /Zi не работает (то есть стек полностью не показывает). /ZI получается, но, повторюсь, приходится отказаться от /GL и /O2 |
| Автор: leniviy 16.7.2012, 19:30 | ||||||
Я попробовал. Плохо работают эти классы, даже в Debug.
При этом с foo(1) работает:
|
| Автор: xTr1m 16.7.2012, 19:34 |
| В другой ветке ответил. Но все равно, мне не главное, что оно работает не всегда. Ведь такой вариант с рекурсией скорее исключение. А обычные стек функций оно вроде ловит. |
| Автор: bsa 16.7.2012, 23:19 |
| К сожалению, получить полностью адекватный бектрейс стека при включенной оптимизации практически нереально. Так как часть функций просто заинлайнивается. В итоге, у тебя может отсутствовать часть вызовов: т.е. будет A-B-E вместо A-B-C-D-E. При оптимизации это совершенно нормально. Другой вопрос, а есть ли смысл вообще пользоваться этими возможностями? Может проще кидать исключения через простой макрос, который будет передавать в конструктор класса исключения информацию о месте ошибки (на подобие assert)? |
| Автор: Randajad 16.7.2012, 23:45 |
| Оптимизации отключают сохранение кадра стека, который необходим для backtrace. Можно это пресечь вот так: /Oy-. А для названий функций нужна отладочная информация. Инлайновые функции с вероятностью 99% не будут в bt. |
| Автор: xTr1m 17.7.2012, 05:06 |
| По поводу других методов обнаружения ошибки я еще подумаю, спасибо. Ок, я понял почему в с оптимизацией стека не будет, но у меня осталось непонимание, что дает эта оптимизация. Ведь в Debug варианте в моих проектах ее нет. Что именно я теряю отключая ее? Скорость работы, скорость компиляции, может что-то еще? |
| Автор: Randajad 17.7.2012, 09:56 |
| Все оптимизации направлены на скорость работы приложения. Нет таких, чтобы на скорость компиляции. Сохранение кадра стека "забирает" 1 регистр(ebp), а их, как известно, и так мало. В некоторой степени падает скорость работы приложения. Но зато благодаря ему можно отследить bt. В debug нет вообще никаких оптимизаций, если что. |
| Автор: xTr1m 17.7.2012, 10:24 |
| Понял, всем большое спасибо. |