通常のブレークポイントがあると、デバッガがブレークしてコールスタックが表示されます。しかし、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つがこの機能で中断しますが、これは簡単なデモです。どのように私は多くのスレッドを持っているときに、アプリケーションが本当に停止した(そして何をやっていた)のですか?
発見したように、デバッガからプロセスに侵入すると、別のスレッドがブレークします。 * 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とし、それを現在のスレッドに設定します。 –