То, что делает, “Не может оценить выражение, потому что код существующего метода оптимизирован”. средний?

Это можно сделать переадресацией, объявив внешний класс как пространство имен.

Образец: нам нужно использовать вложенный класс others :: A :: Nested in others_a.h, который не входит в нашу

others_a.h

namespace others {
struct A {
    struct Nested {
        Nested(int i) :i(i) {}
        int i{};
        void print() const { std::cout << i << std::endl; }
    };
};
}

my_class.h

#ifndef MY_CLASS_CPP
// A is actually a class
namespace others { namespace A { class Nested; } }
#endif

class MyClass {
public:
    MyClass(int i);
    ~MyClass();
    void print() const;
private:
    std::unique_ptr<others::A::Nested> _aNested;
};

my_class.cpp

#include "others_a.h"
#define MY_CLASS_CPP // Must before include my_class.h
#include "my_class.h"

MyClass::MyClass(int i) :
    _aNested(std::make_unique<others::A::Nested>(i)) {}
MyClass::~MyClass() {}
void MyClass::print() const {
    _aNested->print();
}
46
задан Esteban Araya 25 September 2008 в 05:40
поделиться

8 ответов

Отладчик использует FuncEval, чтобы позволить Вам "смотреть" на переменные. FuncEval требует, чтобы потоки были остановлены в управляемом коде в GarbageCollector безопасная точка. Вручную "приостановка" выполнения в IDE заставляет все потоки останавливаться как можно скорее. Ваш очень рекурсивный код будет иметь тенденцию останавливаться в небезопасной точке. Следовательно, отладчик неспособен оценить выражения.

Нажатие F10 переместится в следующую Безопасную точку Funceval и включит функциональную оценку.

Для получения дополнительной информации рассматривают правила FuncEval.

27
ответ дан Nescio 7 November 2019 в 23:53
поделиться

Я полагаю, что то, что Вы видите, является результатом оптимизаций - иногда, переменная будет снова использована - особенно те, которые создаются на стеке. Например, предположите, что у Вас есть метод, который использует два (локальных) целых числа. Первое целое число объявляется в начале метода и используется только в качестве счетчика для цикла. Ваше второе целое число используется после того, как цикл был завершен, и это хранит результат вычисления, которое позже выписано в файл. В этом случае оптимизатор МОЖЕТ решить снова использовать Ваше первое целое число, сохранив код, необходимый для второго целого числа. То, когда Вы пытаетесь посмотреть на второе целое число вначале, Вы получаете сообщение, что Вы спрашиваете о, "Не может оценить выражение". Хотя я не могу объяснить точные обстоятельства, для оптимизатора возможно передать значение второго целого числа в отдельный объект стека позже, приводя к Вам тогда способность получить доступ к значению от отладчика.

-1
ответ дан Anthony K 7 November 2019 в 23:53
поделиться

Вы, вероятно, пытаетесь отладить свое приложение в режиме выпуска вместо режима отладки, или Вам включили оптимизацию в Ваших настройках компиляции.

, Когда код компилируется с оптимизацией, определенные переменные выброшены, как только они больше не используются в функции, которая является, почему Вы получаете то сообщение. В режиме отладки с отключенной оптимизацией Вы не должны получать ту ошибку.

27
ответ дан Lamar 7 November 2019 в 23:53
поделиться

Имел ту же проблему, но смог разрешить его путем выключения захвата исключения в отладчике. Нажмите [Debug] [Exceptions] и установите исключения на "необработанный Пользователем".

Обычно у меня есть это прочь, но это иногда пригождается. Я просто должен не забыть выключать его, когда я сделан.

1
ответ дан Doug Lind 7 November 2019 в 23:53
поделиться

В то время как Отладка. Повреждение () строка сверх стека вызовов, Вы не можете выражения оценки. Поэтому та строка оптимизирована. Нажмите F10 для перемещения в следующую строку - будет работать допустимая строка кода - и часы.

44
ответ дан No one 7 November 2019 в 23:53
поделиться

Друг друга от Microsoft отправил это: http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in-a-non_2D00_optimized-managed-method-that-pushes-more-than-256-argument-bytes-.aspx

наиболее вероятная проблема состоит в том, что Ваш стек вызовов становится оптимизированным, потому что Ваша сигнатура метода является слишком большой.

1
ответ дан 7 November 2019 в 23:53
поделиться

Look for a function call with many params and try decreasing the number until debugging returns.

2
ответ дан 26 November 2019 в 20:12
поделиться

Это сводило меня с ума. Я пробовал подключаться с помощью управляемого и собственного кода - ничего не вышло.

Это сработало для меня, и я наконец смог оценить все выражения:

  • Перейдите в Project / Properties
  • Выберите вкладку Build и нажмите Дополнительно ...
  • Убедитесь, что для параметра "Отладочная информация" установлено значение "полный". (не только для pdb)
  • Отладьте проект - вуаля!
7
ответ дан 26 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: