2010-06-10 55 views
5

我看到一些相關的問題已被問到,但它們要麼太先進,以至於我無法掌握或缺乏分步指南從頭到尾(其中大部分最終都是內部討論他們自己的實驗結果)。 OK這裏是,鑑於這個簡單的程序:先進的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; 
} 

它所做的基本上是打印本身(假設文件名是main.cpp)。

問題

如何我可以把它打印另一個文件,說foobar.txt無需修改源代碼?它與通過VS運行它有關,在調用fread()之前,逐步完成函數並劫持FILE指針。通過撥打fclose()無需擔心泄漏資源。

我想簡單f = fopen("foobar.txt", "r")這給

CXX0017: Error: symbol "fopen" not found 

任何想法?

編輯

我找到了解決辦法小心在Debugging Mozilla on Windows FAQ。正確的命令投入到即時窗口是

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

但是,它並沒有真正回答這個問題:

  • 我還是不明白這到底是怎麼回事。
  • 如何系統地找出任何給定方法的{,,MSVCR100D}部分?我知道MSVCR版本從系統到系統的變化。我怎麼能找到這個?
  • 任何人都可以解釋大括號的語法,尤其是那兩個逗號在那裏做什麼?使用這種語法是否有更多隱藏的寶石?

回答

6

花括號的語法是VS Context Operator,它大部分都被打破了 - 詳細說明鏈接(或者至少幾乎不是隱藏的寶石)。它用於VS表達式評估引擎在運行時解析函數所需的任何地方,例如,在觀察窗口中評估複合表達式,設置斷點或在直接/命令窗口中(如你所見)。

它的第三個參數是包含您希望調用的函數的實現的二進制文件。用於CRT函數例如fopen,這通常相當於 -

MSVCR [VS版本] [d] .dll文件

(I似乎記得需要延長 - 但也許在改變VS2010)。 'D'表示調試dll版本。 VS版本號解碼爲:VS2005 - > 8,VS2008 - > 9,VS2010 - > 10.

另請注意,評估引擎有various other gotchas需要注意。

+0

這是一個非常詳細的寫法。我希望我可以upvote 10倍!只是好奇:你怎麼才能瞭解​​這個晦澀的東西?您的博客在Google上排在第二位,名稱爲「Visual C++上下文運算符」。就我個人而言,我認爲這是一個非常有用的功能。我只是不知道爲什麼它沒有更廣告或打磨得很好。 – kizzx2 2010-06-13 13:57:45

+0

謝謝 - 我真的很擔心鏈接到我自己的博客會被視爲虛榮,但您真的不應該信任MSDN。這些只是我自己的實驗的寫作,絕不是官方的甚至是證明的。如果你(像我一樣)喜歡無證VS東西,你會在博客中找到更多。這個特定的隱藏功能可能不會很快得到任何開發者的愛 - 在評論中有一些關於它的意見。 – 2010-06-13 18:36:15

4

爲了補充Ofek的優秀答案,我發現系統地找出函數調用屬於哪個模塊。 (即MSVCR100D部分)。

  • 單步調試器尋找你想要調用的函數的一個實例。 (在這種情況下,我正在尋找fopen);
  • 當你找到它時,按F11進入它。
  • 右鍵單擊並選擇Show Disassembly
  • 您可以找到當前正在執行的指令的地址。 (如果沒有顯示,請點擊查看選項切換它)
  • 打開模塊調試窗口(Alt + Ctrl + U)
  • 查看加載模塊的列表,查看覆蓋當前指令地址的地址範圍。 Bam,你已經找到了該功能的模塊名稱!

我相信你可以使用這種方法來找到任何類的模塊名稱。例如,當您在查看大型代碼庫並且想要立即調用一些任意類的方法時,這會很有用。您也可以通過自己調用構造函數來即時創建類的實例。

現在不是C++的母語嗎?我們幾乎感覺就像在一個託管的腳本環境中:P

+0

您是否在調用堆棧本身(在函數名稱的左側)看到模塊名稱?我在這裏添加了屏幕截圖 - http://go2.wordpress.com/?id=725X1342&site=thetweaker.wordpress.com&url=http%3A%2F%2Fthetweaker.files.wordpress.com%2F2009%2F05%2Fdecorcallstack.png&sref=http %3A%2F%2Fthetweaker.wordpress.com%2F2009%2F05%2F30%2使用上下文運算符爲系統功能提供功能%2F – 2010-06-13 18:22:18

+0

爲了將這個腳本觸摸提升一個檔次,我無情地使用編輯和-繼續。感謝您的一個帖子主意.. – 2010-06-13 18:38:31

+0

謝謝,不知道:P – kizzx2 2010-06-14 03:05:40

相關問題