6

関連する質問がいくつか寄せられていますが、それらは私には理解できないほど高度であるか、最初から最後までのステップバイステップのガイドが不足しています (それらのほとんどは、自分の実験結果についてのインサイダーの話になってしまいます)。この単純なプログラムを考えると、ここにあります。

#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 ソースコードを変更せずに、別のファイルを印刷するにはどうすればよいですか? fread()VSを介して実行し、関数をステップスルーし、呼び出される直前に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 のバージョンがシステムごとに異なることは知っています。どうすればそれを見つけることができますか?
  • 誰かが中かっこの構文を説明できますか? 特に、そこで 2 つのコンマが何をしているのか? この構文を使用する隠された宝石は他にありますか?
4

2 に答える 2

7

中かっこの構文は V​​S Context Operatorであり、ほとんど壊れています-リンクで詳しく説明されています(または少なくとも、ほとんど隠された宝石ではありません)。これは、VS 式評価エンジンが実行時に関数を解決する必要があるあらゆる場所で使用されます。たとえば、ウォッチ ウィンドウでの複合式の評価、ブレークポイントの設定、または (ご覧のように) イミディエイト/コマンド ウィンドウで使用されます。

3 番目の引数は、呼び出したい関数の実装を含むバイナリです。fopen などの CRT 関数の場合、通常は -

MSVCR[VS版][D].dll

(拡張機能が必要だったことを思い出したようですが、VS2010で変更された可能性があります)。「D」は、デバッグ dll のバージョンを示します。VS バージョン番号は、VS2005 -> 8、VS2008 -> 9、VS2010 -> 10 としてデコードされます。

また、評価エンジンには他にも注意すべきさまざまな落とし穴があることに注意してください。

于 2010-06-13T12:50:49.760 に答える
4

Ofek の優れた回答を補足するために、関数呼び出しがどのモジュールに属しているかを体系的に調べる方法を見つけました。(つまり、そのMSVCR100D部分)。

  • 呼び出す関数のインスタンスを探して、デバッガーをステップ実行します。(この場合、私は探していましたfopen);
  • 見つかったら、F11 キーを押してステップインします。
  • 右クリックして「分解を表示」を選択します
  • 現在実行中の命令のアドレスを見つけることができます。(表示オプションが表示されていない場合は、表示オプションをクリックして切り替えます)
  • モジュールのデバッグ ウィンドウを開く (Alt+Ctrl+U)
  • 現在の命令のアドレスをカバーするアドレス範囲で、ロードされたモジュールのリストを調べます。バム、関数のモジュール名を見つけました!

このメソッドを使用して、任意のクラスのモジュール名を見つけることができると思います。これは、たとえば、大規模なコード ベースを確認していて、任意のクラスのメソッドをイミディエイト ウィンドウでオンザフライで呼び出したい場合に役立ちます。おそらく、コンストラクターを自分で呼び出すことによって、その場でクラスのインスタンスを作成することもできます。

C++ はネイティブ言語ではありませんでしたか? ここでは、管理されたスクリプト環境にいるように感じます:P

于 2010-06-13T14:37:34.623 に答える