高级Visual Studio功夫测试 - 在调试期间从立即窗口调用函数

kiz*_*zx2 5 debugging runtime immediate-window visual-studio

我看到一些相关的问题已被提出,但它们要么太先进了,要么掌握或缺乏从头到尾的逐步指导(大多数人最终都在谈论他们自己的实验结果).好的,这是一个简单的程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

它的作用基本上是打印本身(假设文件名是main.cpp).

如何在foobar.txt 不修改源代码的情况下打印另一个文件?它与通过VS运行它,踩过函数并在fread()调用之前劫持FILE指针有关.无需担心通过呼叫泄漏资源fclose().

我想简单f = fopen("foobar.txt", "r")这给了

CXX0017: Error: symbol "fopen" not found
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑

在Windows FAQ调试Mozilla时偶然发现了解决方案.放入立即窗口的正确命令是

f = {,,MSVCR100D}fopen("foo.txt", "r")
Run Code Online (Sandbox Code Playgroud)

但是,它并没有真正回答这个问题:

  • 我仍然不明白这里发生了什么.
  • 如何系统地找出{,,MSVCR100D}任何给定方法的部分?我知道MSVCR版本在不同系统之间有所变化.我怎么能找到它?
  • 任何人都可以解释大括号的语法,特别是那两个逗号在那里做什么?使用这种语法有更多隐藏的宝石吗?

Ofe*_*lon 6

大括号语法是VS 上下文操作符,它主要被破坏 - 正如在链接中详细描述的那样(或者至少是一个隐藏的宝石).它用于VS表达式 - 评估引擎在运行时需要解析函数的任何位置,例如,在观察窗口中评估复合表达式,设置断点,或者(在您看到的情况下)在立即/命令窗口中.

它的第三个参数是二进制,它包括你想要调用的函数的实现.对于像fopen这样的CRT功能,通常相当于 -

MSVCR [VS版] [D] .dll

(我似乎记得扩展是必要的 - 但可能在VS2010中有所改变)."D"表示调试dll版本.VS版本号解码为:VS2005 - > 8,VS2008 - > 9,VS2010 - > 10.

另请注意,评估引擎还有其他各种需要注意的问题.