расширенный тест кунг-фу в Visual Studio - вызов функций из окна Immediate во время отладки - PullRequest
5 голосов
/ 10 июня 2010

Я вижу, что некоторые связанные вопросы были заданы, но они либо слишком сложны, чтобы я мог их понять, либо отсутствуют пошаговое руководство от начала до конца (большинство из них заканчивают тем, что рассказывали о своих собственных результатах эксперимента) ). Хорошо, вот эта простая программа:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE * f;
    char buffer[100];

    memset(buffer, 0, 100);

    fun();

    f = fopen("main.cpp", "r");
    fread(buffer, 1, 99, f);
    printf(buffer);
    fclose(f);

    return 0;
}

То, что он делает, в основном печатает сам (предположим, имя файла main.cpp).

Вопрос

Как я могу напечатать другой файл, скажем foobar.txt без изменения исходного кода ? Это как-то связано с запуском через VS, пошаговыми функциями и захватом указателя FILE непосредственно перед вызовом fread(). Не нужно беспокоиться об утечке ресурсов, позвонив по номеру fclose().

Я попробовал простой f = fopen("foobar.txt", "r"), который дал

CXX0017: Error: symbol "fopen" not found

Есть идеи?

Редактировать

Я случайно нашел решение на Отладка Mozilla в Windows FAQ . Правильная команда для немедленного ввода:

f = {,,MSVCR100D}fopen("foo.txt", "r")

Однако, на самом деле он не отвечает на этот вопрос:

  • Я до сих пор не понимаю, что здесь происходит.
  • Как систематически узнать часть {,,MSVCR100D} для любого данного метода? Я знаю, что версия MSVCR меняется от системы к системе. Как я могу это выяснить?
  • Может ли кто-нибудь объяснить синтаксис фигурных скобок, особенно, что эти две запятые там делают? Есть ли еще скрытые драгоценные камни, использующие этот синтаксис?

Ответы [ 2 ]

6 голосов
/ 13 июня 2010

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

Его третий аргумент - это двоичный файл, который включает в себя реализацию функции, которую вы хотите вызвать. Для функции CRT, такой как fopen, это обычно составляет -

MSVCR [версия VS] [D] .dll

(кажется, я помню, что расширение было необходимо - но, возможно, это изменилось в VS2010). 'D' указывает версию отладочной DLL. Номер версии VS расшифровывается как: VS2005 -> 8, VS2008 -> 9, VS2010 -> 10.

Также обратите внимание, что у оценочного движка есть различные другие ошибки , за которыми нужно следить.

4 голосов
/ 13 июня 2010

В дополнение к отличному ответу Офека, я нашел способ систематически выяснять, к какому модулю относится вызов функции.(т. е. часть MSVCR100D).

  • Пройдите по отладчику, ища экземпляр функции, которую вы хотите вызвать.(В данном случае я искал fopen);
  • Когда вы найдете его, войдите в него, нажав F11.
  • Щелкните правой кнопкой мыши и выберите Показать разборку
  • Вы можете найти адрес выполняемой в данный момент инструкции.(Щелкните по параметрам просмотра, чтобы переключить его, если он не отображается)
  • Откройте окно отладки модулей (Alt + Ctrl + U)
  • Просмотрите список загруженных модулей с адресомдиапазон, охватывающий адрес текущей инструкции.Бэм, вы нашли имя модуля для функции!

Я полагаю, вы можете использовать этот метод, чтобы найти имя модуля для любого класса.Это может быть полезно, например, когда вы просматриваете большую кодовую базу и хотите на лету вызвать метод произвольного класса в Immediate Window.Вы также можете создавать экземпляры классов на лету, вызывая конструктор самостоятельно.

Разве C ++ не был родным языком?Мы почти чувствуем себя в управляемой среде сценариев: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...