2017-06-05 11 views
0

通常のブレークポイントがあると、デバッガがブレークしてコールスタックが表示されます。しかし、CTRL + Breakを使用して実行を中断するとどうなりますか?私はそれがあったwhererbrt現在実行中のスレッドが壊れることを期待するが、私は一般的に参照するには、次のであるでしょう。CTRL + BreakでブレークしたときにWinDbgで実際の呼び出しスタックを表示する方法

# ChildEBP RetAddr 
00 02b7fdc4 7762f216 ntdll!DbgBreakPoint 
01 02b7fdf4 76c0336a ntdll!DbgUiRemoteBreakin+0x3c 
02 02b7fe00 775c9902 kernel32!BaseThreadInitThunk+0xe 
03 02b7fe40 775c98d5 ntdll!__RtlUserThreadStart+0x70 
04 02b7fe58 00000000 ntdll!_RtlUserThreadStart+0x1b 
*** WARNING: Unable to verify checksum for ThreadDemo.exe 

しかし、私は中断してしまった現在のスレッドの実際のコードにどのように入手できますか?

私はいつかかかりますが、私はそれがそこに壊れることを期待する以下のような長いループを実行しています。

void Bank::Deposit(void* param) 
{ 
    Bank * bank = (Bank *)param; 

    char *who = (char*) bank->bankName; 

    int i; 
    printf("%s: begin deposite\n", who); 
    for (i = 0; i < 1000000000; i++) { 
     bank->balance = bank->balance + 1; 
    } 
    printf("%s: done\n", who); 

    return; 
} 

この場合、ブレークすると、もう一方のスレッドの1つがこの機能で中断しますが、これは簡単なデモです。どのように私は多くのスレッドを持っているときに、アプリケーションが本当に停止した(そして何をやっていた)のですか?

+2

発見したように、デバッガからプロセスに侵入すると、別のスレッドがブレークします。 * all *スレッドのスタックトレースを見るには、['〜* kv'](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/---thread-status-)を使用してください。調査したいコードを実行しているスレッドIDが表示されたら、['〜0s'](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-s)を使用してください--set-current-thread-)、0をスレッドIDとし、それを現在のスレッドに設定します。 –

答えて

2

ためthisを参照してくださいデバッガ。これは、デバッガの少なくとも1つのスレッドがあなた自身ではなく、その時点で実行されていることを意味します。以前に実行されていたスレッドを把握するのは簡単ではありません。

デバッガは、呼び出しスタック上にint 3命令を使用して新しいスレッドをアプリケーションに挿入します。このスレッドはすぐには実行されていません。最初に実行するオペレーティングシステムによってスケジューリングする必要があります。これにはコンテキストスイッチが必要です。

int 3に達すると、プロセス内のすべてのスレッドが中断され、例外についてデバッガに通知されます。したがって、あなたがキーを押すとスレッドが実際に停止すると、〜15 msと〜30 msの間が経過します。

しかし、これは心配するものではありません。人間の平均反応時間が25msである場合、何百万というCPU命令は、スレッドと実際の停止を停止させたいという観察の間にあります。

Sean ClineがコメントとMike Vineの答えですでに述べたように、他のスレッドはそこに残っています。 ~で一覧表示し、~*kを使用して呼び出しスタックを表示するか、~<スレッド> で特定のスレッドに切り替えます。

3

ctrl-cを押すと '実行中のスレッド'はありません。ゼロ、1つ以上のスレッドが実行されているので、デバッガは 'which'を壊すことさえできません。代わりに、それ自身のスレッドでブレークします。ちょうどあなたがその時におそらく実行している単一のスレッドを持っているからですが(必ずしもそうである必要はありません)、これは変わりません。

しかし、あなたが望むものを手に入れることができます。 ctrl-cを押すと、デバッガスレッドが中断され、他のすべてのスレッドが停止します。あなたは次のように入力して、すべてのスレッドとそれらのコールスタックを一覧表示することができます。

~*k

入力して、別のスレッドにあなたができるもスイッチ:Nは、スレッドのIDである

~Ns

切り替える。

「現在のスレッド」を目的のスレッドに設定したら、kと入力して、呼び出しスタックと他のスレッド固有のコマンドを表示できます。

EDIT:

は、あなたがブレークCtrlキー + CまたはCtrlキー + を押すと、その鍵盤イベントがによって処理されたWinDbgのスレッド固有のコマンドのまともなリスト

関連する問題