вызывать функции при отладке в Visual Studio 2005? - PullRequest
8 голосов
/ 07 ноября 2008

Вот то, что я знаю, возможно, возможно, но мне никогда не удавалось сделать
В VS2005 (C ++) при отладке можно вызывать функцию из кода, который я отлаживаю.
Эта функция иногда важна при отладке сложных структур данных, которые не могут быть легко исследованы, используя только обычные возможности окна наблюдения.
Кажется, что окно наблюдения позволяет писать вызовы функций, но каждый раз, когда я пытаюсь это сделать, оно выдает мне ту или иную ошибку.

Error: symbol "func" not found
Error: argument list does not match function
Error: member function not present

Удалось ли кому-нибудь сделать эту работу должным образом? Что мне здесь не хватает?

Редактировать: ясно, что вызываемая функция должна быть символом, который существует в текущей области видимости, в которой находится отладчик.

Ответы [ 7 ]

11 голосов
/ 07 ноября 2008

Хорошо, вот что я нашел
CXX0040 означает, что "The C expression evaluator does not support implicit conversions involving constructor calls."
CXX0047 означает, что "Overloaded functions can be called only if there is an exact parameter match or a match that does not require the construction of an object."

Объединение означает, что если я хочу вызвать функцию, ни один из аргументов не должен иметь неявного преобразования, и ни один из аргументов не должен нуждаться в конструкции.
«неявное преобразование» в этом контексте, по-видимому, включает тривиальные вещи, такие как преобразование 'String' в 'const String&'.
«конструкция», кажется, включает в себя тривиальное копирование. поэтому передача по значению всего, что не является примитивным типом, приведет к ошибке.

Таким образом, это в основном оставляет функции, которые принимают только примитивные типы или указатели.
Я только что успешно проверил эту теорию.

Поэтому, если вы хотите иметь возможность вызывать метод из окна наблюдения, добавьте перегрузку, которая принимает только указатели и примитивы, и в окне наблюдения передайте аргументы соответствующим образом. Чтобы передать объект, который не является примитивом, передайте его адрес.

0 голосов
/ 07 ноября 2008

По моему опыту, есть некоторые недостатки с непосредственным окном. Вы не можете вызывать функции-члены ваших классов, если классы приходят из другой DLL, но получают вводящие в заблуждение сообщения об ошибках. Если что-то находится в одной и той же DLL (например, путем статического связывания во всех других вещах), вызов членов довольно надежен. Но сложные вещи могут работать, а могут и не работать, как упоминали другие.

0 голосов
/ 07 ноября 2008

Это окно "Немедленное", которое вы хотите. И вы ограничены тем, что видно из того места, где находится ваша текущая точка останова. Локальные переменные и функции этого класса (или глобальные переменные)

0 голосов
/ 07 ноября 2008

Я не проверял это, но я всегда думал, что это то, для чего было немедленное окно (выполнение кода)

Cameron

0 голосов
/ 07 ноября 2008

Мы находим, что это работает очень удачно. Работают некоторые очень простые функции (включая функции-члены), как правило, простые методы получения свойств. Другие более сложные функции не работают и выдают ошибку.

Мне никогда не удавалось различить точные правила ...

0 голосов
/ 07 ноября 2008

Насколько мне известно, вы не можете выполнить код из окна Watch во время отладки неуправляемого C ++. Это работает для C # (и, вероятно, VB.NET и управляемого C ++, но я не уверен в этом). Скорее всего, это позволяет, потому что это работает для некоторых языков, но не для других.

0 голосов
/ 07 ноября 2008

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

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

...