2011-04-15 192 views
1

我正在研究VS 2008。我希望得到我所有的方法如下信息:在呼叫进入Visual Studio函数调试

2)时间在呼叫退出和返回值

1)时间。

GDB允许我在每个函数入口和出口处设置一个断点,并在断点处运行脚本,然后继续调试。我厌倦了寻找解决方案在VS上做类似的事情。我甚至想过编写一个脚本来解析我的整个代码并在入口和出口处写入fprintf,但这非常复杂。拼命寻找帮助。

回答

2

使用windbg,你也可以在每个函数入口设置并运行脚本。 例如,以下命令将在模块的所有函数上添加一个断点,显示函数的名称,当前时间,运行到函数退出,显示时间并继续。

bm yourmodule!* "kcL1;.echotime;gu;.echotime;gc" 
+0

我可以打印返回值吗?我正在编译一个有很多dll的大的源代码。我在这里提供.exe文件吗? – Bruce 2011-04-15 13:38:16

+0

.logopen和.logclose将输出重定向到文件。 – Bruce 2011-04-15 16:11:13

+0

在$ retreg寄存器中的返回值 – Bruce 2011-04-15 17:10:48

1

基本上这是一个功能级别的基于时间的分析(TBP)。几个工具可以帮助你:

我建议你先试用AMD CodeAnalyst。如果您没有Visual Studio Premium或Ultimate版本。

+0

我不想剖析代码。我已经使用VS 2008独立探查器。我有专业btw。我希望输出像strace输出。例如。时间戳foo - > rv。 AMD代码分析师会给我这个输出吗? – Bruce 2011-04-15 09:01:40

1

我假设你正在起诉C++。您可以定义一个时间跟踪类显示时间戳

/* define this in a header file */ 
class ShowTimestamp { 
private: 
    static int level_; // nested level for function call tree 

private: 
    const char *func_; 
public: 
    ShowTimestamp(const char* f) : func_(f) { 
     std::cout << func_ << ":" << (level_++) << ":begin\t" << GetTickCount64() << std::endl; 
    } 

    ~ShowTimestamp() { 
     std::cout << func_ << ":" << (--level_) << ":end\t" << GetTickCount64() << std::endl; 
    } 
}; 

#ifndef NO_TRACE_TIMER 
    #define TIMESTAMP_TRACER  ShowTimestamp _stt_(__FUNCTION__); 
#elif 
    #define TIMESTAMP_TRACER 
#endif 

的level_应以CPP声明文件分开。

// You need to define the static member in a CPP file   
int ShowTimestamp::level_ = 0; 

在代码中,你可以做

int Foo(int bar) { 
    TIMESTAMP_TRACER 

    // all the other things. 
    ...... 

    return bar; 
} 

如果你不想追查定时器下去,你可以定义NO_TRACE_TIMER

+1

可以对ShowTimestamp进行细化,以便为嵌套的函数调用添加缩进。 – 2011-04-15 09:46:43

+0

用于嵌套函数调用。所以看起来似乎没有其他方法,只能在每个函数中插入语句。 – Bruce 2011-04-15 11:45:07

1

Visual Studio是不适合这一点;你将不得不使用WinDbg。它有自己的脚本语言,可以让你做你正在寻找的东西。不幸的是,我不知道它的脚本语言的第一件事;你将不得不阅读帮助文件(这实际上或多或少有用,一次)。