Почему мой результат выполнения верен, а результат списка наблюдения неверен? - PullRequest
0 голосов
/ 09 июня 2011

Я написал программу на C ++, и когда я использую режим отладки, я помещаю переменную типа указателя (скажем, m_pdummy) в список наблюдения, но он показывает «bad ptr»;

ЕслиЯ раскрываю этот указатель (нажав «+» слева от имени) и хочу увидеть другие переменные под этим указателем, все переменные показывают « выражение не может быть оценено »;

Однако,в своем коде я написал некоторые выходные данные, например:
CString str;
DWORD d1;
d1 = m_pdummy->m_wgear;
str.Format("%d");
MessageBox(str);
, а затем в окне сообщения отображаетсяправильное значение;

Но если я перетаскиваю m_pdummy, d1, str в список наблюдения, все они говорят, что " выражение не может быть оценено " или " символ не найден «;Но это невозможно, потому что в окне сообщения могут отображаться значения;

Так в чем здесь проблема?!

С наилучшими пожеланиями, кто это читает, Спасибо!

Marson

Ответы [ 2 ]

1 голос
/ 09 июня 2011

может быть тем, что вы находитесь в неправильном кадре стека. Те переменные, которые вы перечисляете, существуют только в зависимости от продолжительности их хранения. Если вы находитесь за пределами этой продолжительности (например, до ввода их функции или после ее выхода), переменная не существует.

Пример, скажем, у вас есть функция (номера строк слева):

20
21    int dbl (int x) {
22        int y = x + x + x;
23        y -= x;
24        return y;
25    }
26

Длительность x указана только в строках 21 через 25y означает 22 через 25). Любая попытка просмотра переменных за пределами этой продолжительности может привести к появлению сообщения, которое вы видите.

Это верно и для объектов, вы не сможете видеть переменные-члены, если объект не был создан.

Другая возможность состоит в том, что даже если объект имеет , экземпляр которого вам может понадобиться, вам может понадобиться полное имя, например, myObject->m_pDummy.

Это предположения, основанные на ограниченной доступной информации, но это первое, на что я бы обратил внимание.

0 голосов
/ 09 июня 2011

Возможно, код, который вы отлаживаете, не совсем тот, который выполняется, или VS Compiler оптимизирует ваш код, так что часть кода больше не существует.
В первом случае, точка останова и значение отладки не могут быть отслежены, вы должны проверить код, совпадающий с кодом отладки. Я придумываю это, когда регистрирую COM-сервер «неправильной» dll.
В последнем случае вы должны закрыть опцию оптимизации. Надеюсь, это поможет вам.

...