![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
В этой теме я в итоге нашел набор классов, позволяющих распечатать текущий стек. сейчас дошло дело до применения, в итоге получилось, что в Release стек распечатывается не полностью. компилятор у меня msvc, добавил флаг /ZI (Debug information format: Programm Database for Edit and Continue), тогда компилятор ругнулся на флаги /GL (Whole Progrmm Optimization) и /O2 (Optimization). Убрав их, я получил работающий вариант с выводом стека. Сам вот так с флагами я никогда не игрался, поэтому прошу более опытных коллег объяснить, что я потеряю, не используя эту оптимизацию и могу ли просто так лих выставлять для Release флаг /Zi
|
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
/ZI и /Zi - разные вещи. Должно хватить /Zi. На скорость он не влияет, только размер получается побольше.
Оптимизация с влагом /Zi должна работать, с /ZI - нет. Оптимизация не должна полностью отключить генерацию стека, но могут быть неточности, если, например, какая-нибудь функция станет inline Это сообщение отредактировал(а) leniviy - 16.7.2012, 19:21 |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Да, извиняюсь. С /Zi не работает (то есть стек полностью не показывает). /ZI получается, но, повторюсь, приходится отказаться от /GL и /O2
|
|||
|
||||
| leniviy |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Я попробовал. Плохо работают эти классы, даже в Debug.
При этом с foo(1) работает:
Это сообщение отредактировал(а) leniviy - 16.7.2012, 19:32 |
||||||
|
|||||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
В другой ветке ответил. Но все равно, мне не главное, что оно работает не всегда. Ведь такой вариант с рекурсией скорее исключение. А обычные стек функций оно вроде ловит.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
К сожалению, получить полностью адекватный бектрейс стека при включенной оптимизации практически нереально. Так как часть функций просто заинлайнивается. В итоге, у тебя может отсутствовать часть вызовов: т.е. будет A-B-E вместо A-B-C-D-E. При оптимизации это совершенно нормально. Другой вопрос, а есть ли смысл вообще пользоваться этими возможностями? Может проще кидать исключения через простой макрос, который будет передавать в конструктор класса исключения информацию о месте ошибки (на подобие assert)?
|
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Оптимизации отключают сохранение кадра стека, который необходим для backtrace. Можно это пресечь вот так: /Oy-. А для названий функций нужна отладочная информация.
Инлайновые функции с вероятностью 99% не будут в bt. Это сообщение отредактировал(а) Randajad - 16.7.2012, 23:45 |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
По поводу других методов обнаружения ошибки я еще подумаю, спасибо. Ок, я понял почему в с оптимизацией стека не будет, но у меня осталось непонимание, что дает эта оптимизация. Ведь в Debug варианте в моих проектах ее нет. Что именно я теряю отключая ее? Скорость работы, скорость компиляции, может что-то еще?
|
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Все оптимизации направлены на скорость работы приложения. Нет таких, чтобы на скорость компиляции.
Сохранение кадра стека "забирает" 1 регистр(ebp), а их, как известно, и так мало. В некоторой степени падает скорость работы приложения. Но зато благодаря ему можно отследить bt. В debug нет вообще никаких оптимизаций, если что. Это сообщение отредактировал(а) Randajad - 17.7.2012, 10:10 |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Понял, всем большое спасибо.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |