3

これを機能させようとしています: http://msdn.microsoft.com/en-us/library/ms171381%28v=vs.100%29.aspx

より具体的には、この別のページで述べたように、イミディエイト ウィンドウを使用してメソッドを呼び出す場合、「関数またはサブルーチンにブレークポイントが含まれている場合、Visual Studio は適切なポイントで実行を中断します。

例外は...少なくとも私にとってはそうではありません。このダミーの c++ テスト ケースで試すことができます。

#include "Windows.h"

void dbgbreak()
{
    DebugBreak(); // set a second breakpoint here
}

int main ()
{
    int i = 0;
    i++; // set a first breakpoint here
    return i;
}

ソースに記載されているブレークポイントを設定して実行します。デバッガーがi++で停止したら、即時ウィンドウからdbgbreak()を呼び出します。

私にとっては、2 つの理由があっても、デバッガーは再び停止しません (呼び出されたメソッド内の明示的な 2 番目のブレークポイントと、win32 API DebugBreak() がブレークポイントをトリガーする必要があるという事実)。

これは予想される動作ですか? それはドキュメントに書かれていることとは正反対のようです...私は何か誤解していますか?

4

1 に答える 1

3

まあ、それは実際に機能しますが、あなたが望んでいる方法ではありません. 関数を次のように変更します。

void dbgbreak()
{
    OutputDebugString(L"Before\n");
    DebugBreak();
    OutputDebugString(L"After\n");
}

イミディエイト ウィンドウを使用すると、次のように表示されます。

dbgbreak()
Before
The evaluation was aborted because an unhandled exception occurred.

これはかなり正確ですが、DebugBreak() は例外を生成します。デバッガーが通常インターセプトして、プログラムをブレーク状態にします。問題は、すでにブレーク状態になっていることです。欠落している機能は、デバッガーがネストされたブレーク状態をサポートしていないことです。WindowsデバッグAPIがサポートしていないため、それを実装するのは難しいはずです。

リンクした MSDN ページがマネージ コードについて話していることに注意してください。非常に異なる種類のデバッガーを使用します。デバッガーがウォッチ式と即時コマンドを評価するために使用する専用スレッドを開始する CLR によって大幅に支援されます。Debugger.Break() ステートメントをサポートします。ネイティブ コードにはこれに似たものはなく、マネージ コードはツール ビルダーの喜びです。

于 2013-06-25T00:52:46.697 に答える