當我們有一個常規的斷點時,調試器會在那裏出現,然後我們看到調用堆棧。但是如果我們使用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;
}
在這種情況下,當它中斷時,另一個線程在這個函數中斷開,但這是一個簡單的演示。我如何知道在真正的Windows應用程序中,當我有很多線程時,應用程序真正停止了什麼(以及它在做什麼)?
正如你所發現的那樣,從調試器入手的過程會產生一個獨立的線程來完成中斷。要查看* all *線程的堆棧跟蹤,請使用['〜* kv'](https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/---thread-status-)。當您看到正在運行您想要調查的代碼的線程ID時,請使用['〜0s'](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-s --set-current-thread-),假設0是線程ID,將其設置爲當前線程。 –