усовершенствованный тест кун-фу Visual Studio — Вызывание функций из Непосредственного Окна во время отладки

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

#include 
#include 

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, ступающий через функции и угоняющий указатель ФАЙЛА прямо прежде fread() назван. Никакая потребность волноваться о протекающих ресурсах путем вызова fclose().

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

CXX0017: Error: symbol "fopen" not found

Какие-либо идеи?

Править

Я узнал решение случайно на Отладке Mozilla в Windows FAQ. Корректная команда для помещения в Непосредственное Окно

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

Однако это действительно не отвечает на этот вопрос:

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

5
задан kizzx2 10 June 2010 в 14:23
поделиться

2 ответа

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

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

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

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

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

6
ответ дан 13 December 2019 в 22:02
поделиться

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

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

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

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

4
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

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