高度な Visual Studio カンフー テスト — デバッグ中にイミディエイト ウィンドウから関数を呼び出す
-
26-09-2019 - |
質問
関連する質問がいくつか寄せられているようですが、内容が高度すぎて理解できないか、最初から最後まで段階的なガイドがありません (質問のほとんどは、最終的には独自の実験結果に関する内輪話になっています)。この単純なプログラムを考えると、これでOKです。
#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 を介して実行し、関数をステップ実行し、直前に FILE ポインタをハイジャックすることに関係しています。 fread()
と呼ばれます。呼び出しによるリソースの漏洩を心配する必要はありません fclose()
.
シンプルなものを試してみました f = fopen("foobar.txt", "r")
与えたのは
CXX0017: Error: symbol "fopen" not found
何か案は?
編集
偶然解決策を見つけました Windows での Mozilla のデバッグに関するよくある質問. 。イミディエイト ウィンドウに入力する正しいコマンドは次のとおりです。
f = {,,MSVCR100D}fopen("foo.txt", "r")
ただし、この質問には実際には答えられません。
- ここで何が起こっているのか、まだわかりません。
- 体系的に調べる方法
{,,MSVCR100D}
特定のメソッドの一部ですか?MSVCR のバージョンはシステムごとに異なることは知っています。どうすればそれを知ることができますか? - 中括弧の構文、特に 2 つのコンマが何をしているのかを説明できる人はいますか?この構文を使用する隠された宝石は他にもありますか?
解決
カーリーブレースの構文は、VS <のhref = "http://thetweaker.wordpress.com/2009/05/30/breaking-on-system-functions-with-the-context-operator/" のrelですほとんど壊れている=「nofollowをnoreferrer」>コンテキストオペレーターに、 - (殆どまたは少なくとも、隠れ家)リンクで詳述されます。例えば、VSの式評価エンジンは、実行時に解決機能に必要どこでも使用されています(あなたが見られるように)即時/コマンドウィンドウで、ウォッチウィンドウで化合物式を評価するブレークポイントの設定、またはます。
はその第三引数は、呼び出したい関数の実装が含まれるバイナリです。通常になるCRT機能などのfopenについて -
MSVCR [VSバージョン] [D]の.dll
( - 多分VS2010に変更されたことを私は必要とされた拡張子を思い出すように見えます)。 「D」は、デバッグDLLのバージョンを示します。 VSのバージョン番号は以下のようにデコードされる:。VS2005 - > 8、VS2008 - > 9、VS2010 - > 10
また、評価・エンジンがあり注意他のさまざまな落とし穴がに注意するします。
他のヒント
Ofek の優れた答えを補足するために、関数呼び出しがどのモジュールに属しているかを体系的に調べるために私が見つけた方法を紹介します。(すなわち、の MSVCR100D
一部)。
- デバッガーをステップ実行して、呼び出したい関数のインスタンスを探します。(この場合、私が探していたのは、
fopen
); - 見つかったら、F11 キーを押してその中に進みます。
- 右クリックして「逆アセンブリを表示」を選択します
- 現在実行中の命令のアドレスを確認できます。(表示オプションが表示されていない場合は、表示オプションの周囲をクリックして切り替えます)
- モジュールのデバッグウィンドウを開きます (Alt+Ctrl+U)
- 現在の命令のアドレスをカバーするアドレス範囲を持つ、ロードされたモジュールのリストを確認します。バン、関数のモジュール名が見つかりました!
このメソッドを使用して、任意のクラスのモジュール名を見つけることができると思います。これは、たとえば大規模なコード ベースをレビューしていて、イミディエイト ウィンドウで任意のクラスのメソッドをオンザフライで呼び出したい場合に便利です。おそらく、コンストラクターを自分で呼び出して、その場でクラスのインスタンスを作成することもできます。
C++ はネイティブ言語ではなかったのでしょうか?ここでは管理されたスクリプト環境にいるような気分になります :P