Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Флаги компилятора, /ZI, /GL, /O2 
V
    Опции темы
xTr1m
Дата 16.7.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
leniviy
Дата 16.7.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



/ZI и /Zi - разные вещи. Должно хватить /Zi. На скорость он не влияет, только размер получается побольше.
Оптимизация с влагом /Zi должна работать, с /ZI - нет.
Оптимизация не должна полностью отключить генерацию стека, но могут быть неточности, если, например, какая-нибудь функция станет inline

Это сообщение отредактировал(а) leniviy - 16.7.2012, 19:21
PM MAIL   Вверх
xTr1m
Дата 16.7.2012, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Да, извиняюсь. С /Zi не работает (то есть стек полностью не показывает). /ZI получается, но, повторюсь, приходится отказаться от /GL и /O2
PM MAIL WWW ICQ   Вверх
leniviy
Дата 16.7.2012, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Я попробовал. Плохо работают эти классы, даже в Debug.
Код

#include "stdafx.h"

#include "call_stack.hpp"
#include <iostream>
using namespace std;

static
void foo(int i) {
  if (i) {
    foo(i-1);
  } else {
    stacktrace::call_stack st;
    cout << st.to_string();
  }
}

int _tmain(int argc, _TCHAR* argv[])
{
  foo(5);
    return 0;
}


Код

c:\users\il\documents\visual studio 2005\projects\stacker\stacker\stacker.cpp (12): foo


При этом с foo(1) работает:
Код

c:\users\il\documents\visual studio 2005\projects\stacker\stacker\stacker.cpp (12): foo
c:\users\il\documents\visual studio 2005\projects\stacker\stacker\stacker.cpp (10): foo
c:\users\il\documents\visual studio 2005\projects\stacker\stacker\stacker.cpp (19): wmain
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (594): __tmainCRTStartup
f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (414): wmainCRTStartup



Это сообщение отредактировал(а) leniviy - 16.7.2012, 19:32
PM MAIL   Вверх
xTr1m
Дата 16.7.2012, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



В другой ветке ответил. Но все равно, мне не главное, что оно работает не всегда. Ведь такой вариант с рекурсией скорее исключение. А обычные стек функций оно вроде ловит.
PM MAIL WWW ICQ   Вверх
bsa
Дата 16.7.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



К сожалению, получить полностью адекватный бектрейс стека при включенной оптимизации практически нереально. Так как часть функций просто заинлайнивается. В итоге, у тебя может отсутствовать часть вызовов: т.е. будет A-B-E вместо A-B-C-D-E. При оптимизации это совершенно нормально. Другой вопрос, а есть ли смысл вообще пользоваться этими возможностями? Может проще кидать исключения через простой макрос, который будет передавать в конструктор класса исключения информацию о месте ошибки (на подобие assert)?
PM   Вверх
Randajad
Дата 16.7.2012, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Оптимизации отключают сохранение кадра стека, который необходим для backtrace. Можно это пресечь вот так: /Oy-. А для названий функций нужна отладочная информация.
Инлайновые функции с вероятностью 99% не будут в bt.

Это сообщение отредактировал(а) Randajad - 16.7.2012, 23:45
PM MAIL   Вверх
xTr1m
Дата 17.7.2012, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



По поводу других методов обнаружения ошибки я еще подумаю, спасибо. Ок, я понял почему в с оптимизацией стека не будет, но у меня осталось непонимание, что дает эта оптимизация. Ведь в Debug варианте в моих проектах ее нет. Что именно я теряю отключая ее? Скорость работы, скорость компиляции, может что-то еще?
PM MAIL WWW ICQ   Вверх
Randajad
Дата 17.7.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Все оптимизации направлены на скорость работы приложения. Нет таких, чтобы на скорость компиляции.
Сохранение кадра стека "забирает" 1 регистр(ebp), а их, как известно, и так мало. В некоторой степени падает скорость работы приложения. Но зато благодаря ему можно отследить bt.

В debug нет вообще никаких оптимизаций, если что. smile

Это сообщение отредактировал(а) Randajad - 17.7.2012, 10:10
PM MAIL   Вверх
xTr1m
Дата 17.7.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Понял, всем большое спасибо.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.