Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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.
Код

#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


Автор: 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 нет вообще никаких оптимизаций, если что. smile

Автор: xTr1m 17.7.2012, 10:24
Понял, всем большое спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)