Вопрос

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

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

Кому-нибудь когда-нибудь удавалось заставить это работать должным образом?Чего я здесь не понимаю?

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

Это было полезно?

Решение

Хорошо, вот что я нашел
CXX0040 означает, что оценщик выражений C не поддерживает неявные преобразования, включающие вызовы конструктора. "
CXX0047 означает, что перегруженные функции можно вызывать только в том случае, если имеется точное совпадение параметра или совпадение, которое не требует создания объекта. "

Таким образом, в сочетании это означает, что если я хочу вызвать функцию, ни один из аргументов не должен иметь неявного преобразования, и ни один из аргументов не должен нуждаться в конструкции.
" неявное преобразование " в этом контексте, кажется, включают тривиальные вещи, такие как преобразование 'String' в 'const String & amp;' .
& Quot; Строительство & Quot; кажется, включают в себя тривиальную копию конструкции. поэтому передача по значению всего, что не является примитивным типом, приведет к ошибке.

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

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

Другие советы

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

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

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

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

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

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

Кэмерон

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top