Visual Studio 2005でデバッグ中に関数を呼び出しますか?
-
06-07-2019 - |
質問
これはおそらく可能だとわかっていることですが、やることができませんでした
VS2005(C ++)では、デバッグ中に、デバッグしているコードから関数を呼び出すことができます。
この機能は、ウォッチウィンドウの通常の機能だけでは簡単に探索できない複雑なデータ構造をデバッグする場合に不可欠なことがあります。
ウォッチウィンドウでは関数呼び出しを記述できますが、試行するたびにエラーが発生します。
エラー:シンボル" func"見つかりません
エラー:引数リストが関数と一致しません
エラー:メンバー関数が存在しません
この作品を適切に作成することに成功した人はいますか? ここに何が欠けていますか?
編集:明らかに、呼び出される関数は、デバッガーが存在する現在のスコープに存在するシンボルでなければなりません。
解決
わかりました、私が見つけたもの
CXX0040は、" C式エバリュエーターは、コンストラクター呼び出しを含む暗黙的な変換をサポートしないことを意味します。
"
CXX0047は、" パラメーターの完全一致またはオブジェクトの構築を必要としない一致がある場合にのみ、オーバーロードされた関数を呼び出すことができることを意味します。
"
つまり、関数を呼び出す場合、引数のいずれも暗黙的な変換を行う必要がなく、引数のいずれも構築を必要としないことを意味します。
「暗黙的な変換」このコンテキストでは、 'String'
を 'const String&'
に変換するような些細なことも含まれているようです。
"建設"些細なコピー構成が含まれているようです。プリミティブ型ではない値を値で渡すとエラーが発生します。
したがって、基本的にはプリミティブ型またはポインターのみを取る関数が残ります。
この理論をうまくテストしたばかりです。
したがって、ウォッチウィンドウからメソッドを呼び出したい場合は、ポインターとプリミティブのみを受け取るオーバーロードを追加し、ウォッチウィンドウで引数を適切に渡します。プリミティブではないオブジェクトを渡すには、そのアドレスを渡します。
他のヒント
ウォッチウィンドウは、現在のコードのコンテキストによって制限されます。たとえば、コードが関数に入って、現在の関数のスコープから隠されている別の関数にアクセスしようとすると、機能しません。
ウォッチウィンドウで関数を呼び出す場合は、現在のスコープから表示およびアクセスできることを確認してください。
私の知る限り、アンマネージC ++のデバッグ中に[ウォッチ]ウィンドウからコードを実行することはできません。これはC#(およびおそらくVB.NETとマネージC ++で機能しますが、私はそれについて肯定的ではありません)。おそらく、一部の言語では機能するが他の言語では機能しないため、許可されます。
この作品は非常にヒットとミスの方法で見つけることができます。いくつかの非常に単純な関数(メンバー関数を含む)が機能し、通常は単純なプロパティゲッターです。他のより複雑な関数は機能せず、エラーが発生します。
正確なルールを識別できなかった...
これはテストしていませんが、それがイミディエイトウィンドウの目的(コードの実行)であると常に考えていました
キャメロン
これは「即時」ですあなたが望むウィンドウ。また、現在のブレークポイントがある場所から見えるものに制限されます。ローカル変数、およびそのクラス(またはグローバル)の関数
私の経験では、イミディエイトウィンドウにはいくつかの欠点があります。クラスが別のDLLからのものである場合、クラスのメンバー関数を呼び出すことはできませんが、誤解を招くエラーメッセージが表示されます。同じDLLに何かがある場合(他のすべてのものに静的にリンクするなど)、メンバーの呼び出しはかなり信頼できます。ただし、他の人が述べたように、複雑なものは機能する場合と機能しない場合があります。