2011-04-15 85 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。它有自己的腳本語言,可以讓你做你正在尋找的東西。不幸的是,我不知道它的腳本語言的第一件事;你將不得不閱讀幫助文件(這實際上或多或少有用,一次)。